有序词典

时间:2014-08-04 11:59:36

标签: python dictionary ordereddictionary

我正在尝试创建一个在编号列表中显示字典键的方法。我选择使用字典,因为密钥的值(作为列表)中存储了大量数据,这里没有显示。
例如:
鲍勃 西蒙
菲尔

我用一个简单的for循环做到了这一点。

if self.caseload:
     i = 1
     print ""
     for name in self.caseload:
          print "%d. %s" % (i, name)
          i += 1

然后我希望用户能够使用其指定的名称(非常简单)或分配给它的号码来选择其中一个键。这是我遇到麻烦的地方。由于字典是无序的并且数字是动态分配的,我不知道如何解决这个问题。

3 个答案:

答案 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来获取该值。