2012-01-04 42 views
0

這是我的第一個Python程序。我實現了一個字典,如下所示。這裏我試圖根據用戶輸入檢索值* (鍵或值) *。Python中的錯誤

例如:如果用戶輸入「1」,那麼我需要從dictioanry中檢索「Sachin Tendulkar」。如果用戶輸入「Sachin Tendulkar」,那麼我需要從dictioanry檢索「1」。

streetno={"1":"Sachin Tendulkar","2":"Sehawag","3":"Dravid","4":"Dhoni","5":"Kohli"} 
while True: 
    inp=input('Enter M/N:') 
if inp=="M" or inp=="m": 
    key=raw_input("Enter the main number :") 
    result=streetno.get(key) 
else: 
     key=raw_inp("Enter the street name : ") 
     result=streetno.get(key) 

我認爲邏輯沒有問題。但我無法執行它。我得到下面顯示的錯誤。

Python 2.7.2 (default, Jun 12 2011, 14:24:46) [MSC v.1500 64 bit (AMD64)] on win32 
Type "copyright", "credits" or "license()" for more information. 
>>> ================================ RESTART ================================ 
>>> 
Enter M/N:m 

Traceback (most recent call last): 
File "C:\Users\kiran\Desktop\Cricketpur.py", line 3, in <module> 
inp=input('Enter M/N:') 
File "<string>", line 1, in <module> 
NameError: name 'm' is not defined 
>>> 
+0

你混入了'input'(你真的應該打開一個大的安全漏洞),'raw_input'和'raw_inp',後者不存在。另外,你是否知道縮進是Python程序邏輯的一部分? – 2012-01-04 17:10:12

+0

-1:可怕的問題標題。這似乎是一個「未定義的變量」問題。請修正您的標題,以便其他人可以從中學習。 – 2012-01-04 18:39:56

回答

5

問題是此行中:

inp=input('Enter M/N:') 

您使用input代替raw_input,你真的不應該,因爲這一切都執行用戶輸入爲Python代碼。只需在這裏使用raw_input,它應該沒問題。

但是,其他代碼也被破壞,不應按預期的那樣工作。我試圖修復它:

streetno = { "1" : "Sachin Tendulkar", 
      "2" : "Sehawag", 
      "3" : "Dravid", 
      "4" : "Dhoni", 
      "5" : "Kohli"} 

# we create a "reversed" dictionary here that maps 
# names to numbers 
streetname = dict((y,x) for x,y in streetno.items()) 

while True: 
    inp = raw_input('Enter M/N:') 
    if inp == "M" or inp == "m": 
     key = raw_input("Enter the main number:") 
     # you don't need .get here, a simple [] is probably what you want 
     result = streetno[key] 
    else: 
     key = raw_input("Enter the street name: ") 
     # we need to use our reversed map here! 
     result = streetname[key] 

    # do something with the result (change that to whatever you want 
    # to do with it) 
    print result 
+0

'streetname = dict((y,x)for x,y in streetno.items())'是一個很好的習慣用法。謝謝。 – Finn 2012-01-04 17:26:08

+0

@Finn:實際上在Python> = 2.7,它有dict解析,成語是'{y:x for x,y in d.iteritems()}'(僅在Python 3中爲'items')。令人驚訝的是,在Python 2.7中,以下內容甚至更快(但是*不*在Python 3中,看起來!):'{d [k]:k for k in d}' – 2012-01-04 17:33:43

+0

甚至更​​加滑動,但都明顯優於使用zip拆包這是我在周圍摸索w /。 – Finn 2012-01-04 17:36:41

2

如果你想使用輸入的raw_input一個字符,而不是輸入(這需要一個表達式,並試圖對其進行評估),而不是raw_inp(不存在)。

另外,您的'while True'表達式永遠不會結束。

而且您還沒有正確縮進'else'子句。

+0

我認爲OP希望程序無限期地繼續下去,因此無限的「while True」循環。 – apiguy 2012-01-04 17:15:52

+0

這個怎麼樣? inp = input('輸入M/N:') – 2012-01-04 17:16:13

+0

是的..我想讓程序無限期地繼續。 – 2012-01-04 17:17:57

2

問題看起來像你正在使用input關於第一個問題(你正在使用raw_input爲他人)

作爲一個側面說明,你可能想看看python的內置模塊cmd對於這種程序。它是專爲創建命令行程序是這樣的:

http://www.doughellmann.com/PyMOTW/cmd/

1

由於您使用的Python 2.7,input()行爲就像eval(raw_input()),這意味着它評估什麼是未來作爲輸入。將其更改爲raw_input()。另外,raw_inp不是一個函數,因此您需要將其更改爲raw_input()

還有一些縮進問題;你應該確保一切都正確縮進。它也似乎你的循環不會結束。