enumerate()用于python中的字典


82

我知道我们使用enumerate了迭代列表,但是我在字典中尝试了它,但没有给出错误。

码:

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

有人可以解释输出吗?


2
for i, j in enumerate(enumm)i在每次迭代时 都会递增,并jenumerate函数参数(在本例中为字典)中捕获通常的项。遍历字典本质上是遍历其键。
Divyanshu Srivastava

Answers:


110

除了已经提供的答案外,Python中还有一个非常不错的模式,可让您枚举字典的键和值。

通常情况下,您枚举字典的键

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

1
(+1)您也可以简单地使用dictionary.items()(不枚举)获取具有键值对的视图对象作为元组列表。
Tiago Martins Peres李大仁

62

输出的第一列是其中每个项目的索引,enumm第二列是其键。如果要迭代字典,请使用.items():

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

输出应如下所示:

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

31

我以为我想补充一下,如果您想枚举字典的索引,键和值,则for循环应如下所示:

for index, (key, value) in enumerate(your_dict.items()):
    print(index, key, value)

3
这个问题与语法有关,这个答案提供了两个最短括号的最短解决方案:idx, (k, v) in enumerate(d.items()):
Sean Pianka

嗨,肖恩,我不确定您是否同意答案,或者只是说较短的变量名会带来更好的答案?
乔丹·麦基

25
dict1={'a':1, 'b':'banana'}

要在Python 2.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'))

但这违背了字典(映射,关联数组)的目的, 字典是一种用于电话簿样式查找的有效数据结构。字典排序可能是实现所附带的,因此不应该依赖字典。如果需要订单,请改用 OrderedDict


2
不允许我在这篇文章中进行2个字符的编辑,但是OP将其标记为适用于Python 3,因此print语句需要在k,v周围加上括号。
wp-overwatch.com's

@先生。我,ty,会解决的。
roadrunner66 '36

19
应该注意的是仅适用于python2。dict.iteritems()在python3除去,也参见stackoverflow.com/questions/30418481/...
GYGER

1
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
lkahtz

泰 更新了python3和python2。添加了对枚举的评论。
roadrunner66

5

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

因此,即使没有键,您也将3进入该行的第一列3 43

enumerate 在数据结构(列表或字典)中进行迭代,同时还提供当前的迭代编号。

因此,此处的列是迭代号,后跟字典中的键 enum

其他解决方案已经展示了如何在键和值对之间进行迭代,因此在我的教程中不再重复。


4

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对的索引,第二列keys给出了字典的enumm

因此,如果您希望第一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

沃伊拉


1
对于字典而言并非如此。您的代码将使用索引(用于迭代)遍历字典,但不会给出字典的键值组合。请改用dict.items()。
马赛厄斯

是的,您也可以继续使用dict.items()。感谢您的更正。
Abhishek Roy

3

那肯定看起来令人困惑。所以这是怎么回事。枚举的第一个值(在本例中为i)返回从0开始的下一个索引值,因此0、1、2、3,...它将始终返回这些数字,而不管字典中的内容如何。enumerate的第二个值(在本例中为j)返回字典/枚举(在Python中称为字典)中的值。您真正想做的是roadrunner66的响应。


3
  1. 迭代Python字典意味着迭代其键与使用完全相同 dict.keys()
  2. 键的顺序由实现代码确定,您不能期望某些特定的顺序:

    键和值以任意顺序进行迭代,该顺序是非随机的,在Python实现中会有所不同,并且取决于字典的插入和删除历史。如果对键,值和项视图进行了迭代,而对字典没有任何中间修改,则项的顺序将直接对应。

这就是为什么在第一列中看到索引0到7的原因。它们是由生产enumerate且始终以正确的顺序排列。此外,您会在第二列中看到字典的键0至7。他们没有排序。


3

Python3:

一种解决方案:

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}

1
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'))]

0

您可能会发现在索引中包含索引很有用:

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

输出:

{(0, 'a'): True, (1, 'b'): False}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.