我知道我们使用 enumerate来迭代一个列表,但是我在字典上试了一下,它没有给出一个错误。
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
有人能解释一下输出吗?
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中每个项目的索引,第二列是它们的键。如果你想迭代你的字典,然后使用。项目() :
enumm
for k, v in enumm.items(): print(k, v)
输出应该是这样的:
0 1 1 2 2 3 4 4 5 5 6 6 7 7
dict.keys()
键和值以任意顺序迭代,即 非随机,因 Python 实现而异,并且依赖于 字典的插入和删除历史记录 对项视图进行迭代,不对 字典,项目的顺序将直接对应。
这就是为什么您会在第一列中看到0到7的索引。它们由 enumerate生产,并且总是按照正确的顺序排列。此外,您还可以在第二列中看到从0到7的 dict 键。它们没有被分类。
当处理列表时,enumerate()实际上给出了列表中项目的索引和值。 例如:
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)
它提供输出
其中第一列给出 key:value对的索引,第二列表示字典 enumm的 keys。
key:value
keys
因此,如果希望第一列是 keys,第二列是 values,那么最好尝试 dict.iteritems()(Python 2)或 dict.items()(Python 3)
values
dict.iteritems()
dict.items()
for i, j in enumm.items(): print(i, j)
输出
瞧
巨蟒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实际上是键的索引,而不是键本身。
i
因此,即使没有键 3,也可以在行 3 4的第一列中获得 3。
3
3 4
enumerate循环访问数据结构(不管是列表还是字典) ,同时提供当前的迭代次数。
因此,这里的列是迭代次数,后跟字典 enum中的键
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}