您真正的问题是“如何将字符串映射到 Python 中的数字”(反之亦然)。由于当前的标题可能具有误导性,让我们首先针对“如何比较字符串和数字”的人们解决这个问题:与流行的脚本语言不同,Python 不会进行自动类型转换。例如,在 Javascript 中,您可以这样做:
>>> 5 == '5'
true
但在 Python 中它是 False:
>>> 5 == '5'
False
如果您希望它们具有不同的类型,则必须将这两个值显式转换为相同的类型(例如string
or ):int
>>> str(5) == str('5')
True
现在让我们回到你真正的问题。正如@GarethLatty 评论的那样:
name1
,name2
是一个非常常见的反模式。请改用数据结构(列表、字典等)。这种问题也变得微不足道。
Python 中的两种基本容器数据类型是list
和dict
.
使用列表:
>>> name_list = ['rock', 'paper', 'scissors', 'lizard', 'spock']
>>> name_list.index('spock')
4
列表索引是从零开始的:
>>> name_list[0]
'rock'
使用 dict 您可以将任意数字与字符串相关联:
>>> name_dict = {'rock': 1, 'paper': 2, 'scissors': 3, 'lizard': 4, 'spock': 5}
>>> name_dict['spock']
5
如果列表中不存在该值,则该index
方法将引发ValueError
异常。在 Python 中,通常用块包围这种表达式try
(如 icktoofay 所评论的):
>>> name = 'kirk'
>>> try:
... name_list.index(name)
... except ValueError:
... print('{} is not a valid name.'.format(name))
...
kirk is not a valid name.
这种编程风格非常流行。使用 a dict
,您必须注意的例外是KeyError
:
>>> name_dict['kirk']
Traceback (most recent call last):
File "<interactive input>", line 1, in <module>
KeyError: 'kirk'
如果您从 Python 开始,REPL(read-eval-print 循环,Python 提示符)是您最好的朋友。help
只需使用和dir
内置函数探索任何内容:
>>> dir(name_dict)
['__class__', '__cmp__', '__contains__', '__delattr__', '__delitem__',
'__doc__', '__eq__', '__format__', '__ge__', '__getattribute__',
'__getitem__', '__gt__', '__hash__', '__init__', '__iter__', '__le__',
'__len__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__',
'__repr__', '__setattr__', '__setitem__', '__sizeof__', '__str__',
'__subclasshook__', 'clear', 'copy', 'fromkeys', 'get', 'has_key',
'items', 'iteritems', 'iterkeys', 'itervalues', 'keys', 'pop',
'popitem', 'setdefault', 'update', 'values', 'viewitems', 'viewkeys',
'viewvalues']
>>> help(name_dict.keys)
Help on built-in function keys:
keys(...)
D.keys() -> list of D's keys
>>>