【问题标题】:enumerate() for dictionary in PythonPython 中的 enumerate() 字典
【发布时间】:2016-07-14 15:39:06
【问题描述】:

我知道我们使用 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

有人可以解释一下输出吗?

【问题讨论】:

  • for i, j in enumerate(enumm) 在每次迭代时使i 递增,jenumerate 函数参数中捕获常用项,在本例中是字典。迭代字典本质上就是迭代它的键。

标签: python python-3.x dictionary enumerate


【解决方案1】:
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'))

但这违背了dictionary (map, associative array) 的目的,它是一种用于电话簿式查找的有效数据结构。字典排序可能是实施过程中附带的,不应依赖。如果您需要订单,请改用 OrderedDict

【讨论】:

  • 不允许我对这篇文章进行 2 个字符的编辑,但 OP 将其标记为用于 Python 3,因此打印语句需要在 k,v 周围加上括号。
  • @Mr.我,你,会解决的。
  • 这个需要注意的是只适用于python2。 dict.iteritems() 在 python3 中被删除,另见stackoverflow.com/questions/30418481/…
  • ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  • 泰。更新了 python3 与 python2。添加了对枚举的评论。
【解决方案2】:

这肯定看起来令人困惑。所以这就是正在发生的事情。 enumerate 的第一个值(在本例中为 i)返回从 0 开始的下一个索引值,因此 0、1、2、3、... 无论字典中的内容如何,​​它都会始终返回这些数字。 enumerate 的第二个值(在本例中为 j)返回字典/枚举中的值(我们在 Python 中称其为字典)。你真正想做的是 roadrunner66 的回应。

【讨论】:

    【解决方案3】:

    输出的第一列是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
    

    【讨论】:

      【解决方案4】:
      1. 迭代 Python dict 意味着迭代其键的方式与 dict.keys() 完全相同
      2. 键的顺序由实现代码确定,您不能指望某些特定的顺序:

        键和值以任意顺序迭代,即 非随机的,因 Python 实现而异,并且取决于 字典的插入和删除历史。如果键、值和 项目视图被迭代,没有干预修改 字典,项目的顺序会直接对应。

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

      【讨论】:

        【解决方案5】:

        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
        

        【讨论】:

        • 这不适用于字典。您的代码将使用索引(用于迭代)迭代字典,但不提供字典的键值组合。使用 dict.items() 代替。
        • 是的,你也可以继续使用 dict.items()。谢谢指正。
        【解决方案6】:

        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}
        

        【讨论】:

          【解决方案7】:

          除了已经提供的答案之外,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) 你也可以简单地使用dictionary.items()(没有枚举)来获取一个包含键值对的视图对象作为元组列表。
          • 我不确定为什么这是评分最高的答案。基本上代码太多了;并可能产生错误的答案。将enumeratedict 一起使用具有潜在危险。 Python在使用enumerate时不保证键顺序;在后续运行中可能会以不同的顺序发出密钥。 @roadrunner66 的回答是最正确的解决方案。
          • 这对于 Python 3.7+ 来说没问题,因为字典是保证有序的
          【解决方案8】:

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

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

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

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

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

          【讨论】:

            【解决方案9】:

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

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

            【讨论】:

            • 这个问题与语法问题有关,这个答案提供了两个加括号的最短解决方案:idx, (k, v) in enumerate(d.items()):
            • 嗨,肖恩,我不确定您是否同意这个答案,或者只是说较短的变量名称可以得到更好的答案?
            【解决方案10】:
            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'))]
            

            【讨论】:

              【解决方案11】:

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

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

              输出:

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

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2012-01-22
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2018-09-28
                • 1970-01-01
                相关资源
                最近更新 更多