在 Python 中为 dictionary 枚举()

我知道我们使用 enumerate来迭代一个列表,但是我在字典上试了一下,它没有给出一个错误。

密码:

enumm = {0: 1, 1: 2, 2: 3, 4: 4, 5: 5, 6: 6, 7: 7}


for i, key in enumerate(enumm):
print(i, key)

产出:

0 0


1 1


2 2


3 4


4 5


5 6


6 7

有人能解释一下输出吗?

276504 次浏览
dict1={'a':1, 'b':'banana'}

要列出 Python2.x 中的字典:

for k,v in dict1.iteritems():
print k,v

在 Python 3.x 中使用:

for k,v in dict1.items():
print(k,v)
# a 1
# b banana

最后,正如其他人所指出的,如果你想要一个运行索引,你也可以拥有:

for i  in enumerate(dict1.items()):
print(i)


# (0, ('a', 1))
# (1, ('b', 'banana'))

但这违背了 字典(地图,关联数组)的初衷,字典(地图,关联数组)是一种用于电话簿式查询的高效数据结构。字典顺序可能是实现的附带条件,不应该依赖于它。如果您需要订单,则使用 命令代替。

这肯定让你很困惑。原来是这么回事。枚举的第一个值(在本例中是 i)返回从0开始的下一个索引值,所以0,1,2,3,... 它总是返回这些数字,而不管字典中有什么。枚举的第二个值(在本例中为 j)返回 dictionary/枚举中的值(在 Python 中我们称之为 dictionary)。你真正想要做的是什么 Roadrunner 66回应。

输出的第一列是 enumm中每个项目的索引,第二列是它们的键。如果你想迭代你的字典,然后使用。项目() :

for k, v in enumm.items():
print(k, v)

输出应该是这样的:

0 1
1 2
2 3
4 4
5 5
6 6
7 7
  1. 迭代 Python dict 意味着以与 dict.keys()完全相同的方式迭代其键
  2. 键的顺序是由实现代码决定的,您不能期望一些特定的顺序:

    键和值以任意顺序迭代,即 非随机,因 Python 实现而异,并且依赖于 字典的插入和删除历史记录 对项视图进行迭代,不对 字典,项目的顺序将直接对应。

这就是为什么您会在第一列中看到0到7的索引。它们由 enumerate生产,并且总是按照正确的顺序排列。此外,您还可以在第二列中看到从0到7的 dict 键。它们没有被分类。

当处理列表时,enumerate()实际上给出了列表中项目的索引和值。 例如:

l = [1, 2, 3, 4, 5, 6, 7, 8, 9]
for i, j in enumerate(list):
print(i, j)

给予

0 1
1 2
2 3
3 4
4 5
5 6
6 7
7 8
8 9

第一列表示项目的索引,第二列表示项目本身。

在字典里

enumm = {0: 1, 1: 2, 2: 3, 4: 4, 5: 5, 6: 6, 7: 7}
for i, j in enumerate(enumm):
print(i, j)

它提供输出

0 0
1 1
2 2
3 4
4 5
5 6
6 7

其中第一列给出 key:value对的索引,第二列表示字典 enummkeys

因此,如果希望第一列是 keys,第二列是 values,那么最好尝试 dict.iteritems()(Python 2)dict.items()(Python 3)

for i, j in enumm.items():
print(i, j)

输出

0 1
1 2
2 3
4 4
5 5
6 6
7 7

巨蟒3:

一种解决办法是:

enumm = {0: 1, 1: 2, 2: 3, 4: 4, 5: 5, 6: 6, 7: 7}
for i, k in enumerate(enumm):
print("{}) d.key={}, d.value={}".format(i, k, enumm[k]))

Output:
0) enumm.key=0, enumm.value=1
1) enumm.key=1, enumm.value=2
2) enumm.key=2, enumm.value=3
3) enumm.key=4, enumm.value=4
4) enumm.key=5, enumm.value=5
5) enumm.key=6, enumm.value=6
6) enumm.key=7, enumm.value=7

另一个例子:

d = {1 : {'a': 1, 'b' : 2, 'c' : 3},
2 : {'a': 10, 'b' : 20, 'c' : 30}
}
for i, k in enumerate(d):
print("{}) key={}, value={}".format(i, k, d[k])

Output:
0) key=1, value={'a': 1, 'b': 2, 'c': 3}
1) key=2, value={'a': 10, 'b': 20, 'c': 30}

除了已经提供的答案之外,Python 中还有一个非常好的模式,允许您枚举 dictionary 的键和值。

通常情况下,你 列举关键字的字典:

example_dict = {1:'a', 2:'b', 3:'c', 4:'d'}


for i, k in enumerate(example_dict):
print(i, k)

产出:

0 1
1 2
2 3
3 4

但是如果你想要 通过键和值进行枚举,这就是方法:

for i, (k, v) in enumerate(example_dict.items()):
print(i, k, v)

产出:

0 1 a
1 2 b
2 3 c
3 4 d

由于您使用的是 enumerate,因此您的 i实际上是键的索引,而不是键本身。

因此,即使没有键 3,也可以在行 3 4的第一列中获得 3

enumerate循环访问数据结构(不管是列表还是字典) ,同时提供当前的迭代次数。

因此,这里的列是迭代次数,后跟字典 enum中的键

Other Solutions 已经展示了如何迭代键和值对,所以我不会在我的解决方案中重复同样的操作。

我只是想补充一点,如果你想枚举一个字典的索引、键和值,你的 for 循环应该像这样:

for index, (key, value) in enumerate(your_dict.items()):
print(index, key, value)
d = {0: 'zero', '0': 'ZERO', 1: 'one', '1': 'ONE'}


print("List of enumerated d= ", list(enumerate(d.items())))

产出:

List of enumerated d=  [(0, (0, 'zero')), (1, ('0', 'ZERO')), (2, (1, 'one')), (3, ('1', 'ONE'))]

您可能会发现在键中包含索引是有用的:

d = {'a': 1, 'b': 2}
d = {(i, k): v for i, (k, v) in enumerate(d.items())}

产出:

{(0, 'a'): True, (1, 'b'): False}