0

我正在尝试创建一种在编号列表中显示字典键的方法。我选择使用字典是因为键的值(作为列表)中存储了很多数据,这里没有显示。
例如:
1. Bob
2. Simon
3. Phil

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

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

然后,我希望用户能够使用其分配的名称(非常简单)或分配给它的数字来选择其中一个键。这就是我遇到麻烦的地方。由于字典是无序的并且数字是动态分配的,我不知道该怎么做。

4

3 回答 3

3

您可以使用OrderDict

有序字典就像普通字典一样,但它们会记住插入项目的顺序

您也可以在迭代时使用enumerate来获取项目的索引

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

于 2014-08-04T12:15:47.227 回答
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)
于 2014-08-04T12:00:58.927 回答
0

有几种方法可以解决这个问题。

您可以创建一个新的字典来将数字链接到名称;

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'}

检查输入是否为数字;如果是这样,您可以使用 dicte来获取名称,或者您可以使用f来获取值。

于 2014-08-04T12:17:23.623 回答