enumerate()用于python中的字典

enumerate() for dictionary in python

我知道我们使用enumerate来迭代一个列表,但我在字典中尝试过,没有给出错误。

代码:

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

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

输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
0 0

1 1

2 2

3 4

4 5

5 6

6 7

有人能解释输出吗?


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

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

输出应该是:

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

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

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

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

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

输出:

1
2
3
4
0 1
1 2
2 3
3 4

但是,如果要同时枚举键和值,则可以这样:

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

输出:

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


1
2
for k,v in dict.iteritems():
    print(k,v)


我想补充一下,如果你想枚举字典的索引、键和值,你的for循环应该如下:

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

因为您使用的是enumerate,所以您的i实际上是键的索引,而不是键本身。

所以,在行3 4的第一列中得到3,即使没有键3

enumerate迭代一个数据结构(无论是列表还是字典),同时还提供当前的迭代号。

因此,这里的列是迭代号,后面是字典enum中的键。

其他的解决方案已经演示了如何迭代键和值对,所以我不会在我的中重复相同的步骤。


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

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

给予

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

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

字典里

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

它给出了输出

1
2
3
4
5
6
7
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)。

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

输出

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

沃伊拉


Python 3:

一种解决方案:

1
2
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]))
1
2
3
4
5
6
7
8
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

另一个例子:

1
2
3
4
5
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])
1
2
3
Output:    
    0) key=1, value={'a': 1, 'b': 2, 'c': 3}
    1) key=2, value={'a': 10, 'b': 20, 'c': 30}

这肯定让人困惑。这就是发生的事情。枚举的第一个值(在本例中为i)返回从0开始的下一个索引值,因此0、1、2、3、…。它总是返回这些数字,不管字典中是什么。枚举的第二个值(在本例中是j)返回dictionary/enumm中的值(我们在python中将其称为dictionary)。你真正想做的是路行者66的回应。


D=0:'零','0':'零',1:'一','1':'一'

print("枚举d=",list(enumerate(d.items()))

输出:枚举d的列表=[(0,(0,'zero')),(1,('0,'zero')),(2,(1,'one')),(3,('1,'one'))]


  • 对python dict的迭代意味着对其键的迭代与对dict.keys()的迭代完全相同。
  • 键的顺序由实现代码决定,您不能期望某些特定的顺序:

    Keys and values are iterated over in an arbitrary order which is
    non-random, varies across Python implementations, and depends on the
    dictionary’s history of insertions and deletions. If keys, values and
    items views are iterated over with no intervening modifications to the
    dictionary, the order of items will directly correspond.

  • 这就是您在第一列中看到索引0到7的原因。它们是由enumerate生产的,并且总是按正确的顺序排列。您还可以在第二列中看到dict的键0到7。它们没有分类。