2012-01-04 45 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()

还有一些缩进问题;你应该确保一切都正确缩进。它也似乎你的循环不会结束。