【问题标题】:Using .iteritems() to iterate over key, value in Python dictionary使用 .iteritems() 遍历 Python 字典中的键、值
【发布时间】:2015-07-25 05:30:13
【问题描述】:

注意:我有read this post and Alex Martelli's response,但我并不真正/完全理解他的回答。这有点超出我目前的理解。我想帮助更好地理解它。

我了解到,当您尝试以下 for 循环时:

for key, value in dict:
    print key
    print value 

你得到:

ValueError: too many values to unpack

虽然您可以遍历字典并使用以下内容获取键:

for key in dict:
    print key 

谁能提供一个稍微不那么高级的解释来解释为什么你不能在不使用 .iteritems() 的情况下使用 key, value 来迭代字典?

【问题讨论】:

    标签: python python-2.7 dictionary


    【解决方案1】:

    另一个答案很好地解释了这一点。但这里有一些关于它的行为方式的进一步说明,通过展示它实际工作没有错误的情况(所以你可以看到一些东西):

    >>> d = {(1,2): 3, (4,5): 6}
    >>> for k, v in d:
            print k, v
    
    1 2
    4 5
    

    循环遍历键 (1,2)(4,5),由于这些“恰好是”大小为 2 的元组,它们可以分配给 kv

    也适用于字符串,只要它们正好有两个字符:

    >>> d = {"AB":3, "CD":6}
    >>> for k, v in d:
            print k, v
    
    A B
    C D
    

    我假设你的情况是这样的?

    >>> d = {"ABC":3, "CD":6}
    >>> for k, v in d:
            print k, v
    
    Traceback (most recent call last):
      File "<pyshell#42>", line 1, in <module>
        for k, v in d:
    ValueError: too many values to unpack
    

    这里,键“ABC”是一个三元组,因此 Python 抱怨试图将其解压缩为两个变量。

    【讨论】:

    • 虽然这是正确的,但考虑到问题的上下文,它实际上对 OP 没有帮助
    • 我希望它通过一些示例来说明行为有所帮助,尤其是实际导致收到ValueError 的示例。我正在为此添加更多答案...
    • @DougR。现在怎么样了?
    • 好多了。评分为 +1。
    【解决方案2】:

    Python 有一个称为可迭代解包的功能。当你这样做时

    a, b = thing
    

    Python 假设 thing 是一个元组或列表或具有 2 个项目的东西,并将第一个和第二个项目分配给 ab。这也适用于for 循环:

    for a, b in thing:
    

    等价于

    for c in thing:
        a, b = c
    

    除了它没有创建 c 变量。

    这意味着如果你这样做

    for k, v in d:
    

    Python 无法看到您说 k, v 而不是 k 并给您项目而不是键的事实,因为键可能是 2 元组。它必须遍历键并尝试将每个键解包到 kv 变量中。

    【讨论】:

      【解决方案3】:

      在使用for xx in XX 时,实际上是在使用迭代器来迭代XX,而XX 必须是可迭代的。您可以使用iter 函数来获取迭代器,如

      >>> d = dict(a=1,b=2)
      >>> i = iter(d)
      >>> i
      <dictionary-keyiterator object at 0x6ffff8739f0>
      

      并使用next 访问元素。

      >>> next(i)
      'a'
      

      所以在for k in d的每一次迭代中,k都会被赋值给next(i),它只是没有值的key。例如,在第一轮迭代中,

      k = 'a'
      

      .iteritems() 将返回另一个迭代器,它可以获得一个组合键值的元组。让我们检查一下

      >>> i = d.iteritems()
      >>> i
      <dictionary-itemiterator object at 0x6ffff873998>
      >>> next(i)
      ('a', 1)
      

      看到了吗?在for k, v in d.iteritems()的第一轮,我们居然得到了这个任务

      k, v = ('a', 1)
      

      因此,如果你使用for k, v in d,你会得到

      k, v = 'a'
      

      这是非法的分配。

      【讨论】:

        【解决方案4】:

        在 Python 2.7.6 中,您可能希望使用 dict.has_key(property_name) 检查字典的子属性。

        【讨论】:

          猜你喜欢
          • 2021-11-23
          • 2015-09-27
          • 1970-01-01
          • 1970-01-01
          • 2014-05-15
          • 1970-01-01
          • 1970-01-01
          • 2013-05-18
          • 1970-01-01
          相关资源
          最近更新 更多