我正在尝试创建一个在编号列表中显示字典键的方法。我选择使用字典,因为密钥的值(作为列表)中存储了大量数据,这里没有显示。
例如:
鲍勃
西蒙
菲尔
我用一个简单的for循环做到了这一点。
if self.caseload:
i = 1
print ""
for name in self.caseload:
print "%d. %s" % (i, name)
i += 1
然后我希望用户能够使用其指定的名称(非常简单)或分配给它的号码来选择其中一个键。这是我遇到麻烦的地方。由于字典是无序的并且数字是动态分配的,我不知道如何解决这个问题。
答案 0 :(得分:3)
您可以使用OrderDict
有序词典就像常规词典,但它们记住了项目的插入顺序
此外,您可以使用enumerate在迭代时获取项目索引
for i, name in enumarate(self.caseload, start=1):
print "%d. %s" % (i, name)
答案 1 :(得分:2)
只要您不在字典中添加或删除密钥,密钥的顺序仍为稳定。
您可以为dict.keys()
列表编制索引,它仍然具有与显示密钥时相同的顺序:
key = self.caseload.keys()[int(userchoice) - 1]
由于Python列表从0开始编制索引,因此您必须通过减去1来翻译用户输入。
在打印菜单时,请考虑使用enumerate()
对键进行编号,而不是使用手动计数:
if self.caseload:
print ""
for i, name in enumerate(self.caseload, 1):
print "%d. %s" % (i, name)
答案 2 :(得分:0)
有几种方法可以解决这个问题。
您可以创建一个新的dict来将数字链接到名称;
In [2]: d = {'Bob': 'foo', 'Simon': 'bar', 'Phil': 'baz'}
In [3]: e = {n: v for n, v in zip(range(1, len(d)+1), d.keys())}
In [4]: e
Out[4]: {1: 'Bob', 2: 'Simon', 3: 'Phil'}
或者您可以将数字直接链接到字典的值;
In [5]: f = {n: v for n, v in zip(range(1, len(d)+1), d.values())}
In [6]: f
Out[6]: {1: 'foo', 2: 'bar', 3: 'baz'}
检查输入是否为数字;如果是这样,您可以使用dict e
来获取名称,或者您可以使用f
来获取该值。