【问题标题】:Make a simple Python dictionary generator制作一个简单的 Python 字典生成器
【发布时间】:2023-03-24 04:38:01
【问题描述】:

这是一个基本上进行迭代的示例代码。

>>> d = {'lol': {'12': '3',  '35':''}, 'w': {'12': '3', '35':''}}

>>> def iteritems(s):
...     keys = s.keys()
...     for key in keys:
...             yield key, s[key]
... 
>>> for k, v in iteritems(d):
...     print k, v
... 
w {'12': '3', '35': ''}
lol {'12': '3', '35': ''}

这是一个有效的生成器。但是生成器iteritems 必须调用s.keys() 来缓存字典中的所有键。如果字典很大(超过 100 个项目),则内存效率不高。

但由于字典不是有序结构,我认为获取该键列表是必须的。

有人可能会争辩说:键的数量远远少于计算键和值的项目数。

有什么建议吗?或者更好的方式(当然我需要支持嵌套迭代,但这是另一回事)。

【问题讨论】:

    标签: python dictionary generator


    【解决方案1】:

    在 python 2.x 中使用.iterkeys();在 python 3.x 中,.keys() is a view 而不是一个新列表。在 python 2.7 中,你也可以使用viewkeys() method 来获得同样的东西。

    有一个等效的.iteritems() method,使您的实用程序方法变得多余。 :-) 同样的说明适用于 python 3.x 和 2.7,请参阅提供的文档。

    【讨论】:

    • 啊。所以它是内置的,我曾经认为keys 是一个列表。大错。等等,iterkeys 是一个生成器 - 还是只是一个必须将整个字典放入内存的普通迭代器?
    • @CppLearner: iterkeys() 是一个迭代器。生成器函数也会产生迭代器,所以从某种意义上说,答案是肯定的。
    • 谢谢。我其实很困惑。在文档中,.items 是一个副本。但是iteritems 是一个迭代器,我认为这只是一个构建在items 之上的迭代器。那么它不只是另一个普通的迭代器吗?文档没有说明它是具有next() 方法的普通迭代器还是具有生成器优势的迭代器(例如yield 语句的存在)?
    • @CppLearner:不,iteritems() 迭代底层字典,而items() 创建一个新列表并返回它。
    • @CppLearner:生成器是一种生成迭代器的方法。从这个意义上说,iteritems() 方法是一个生成器。
    【解决方案2】:

    您正在重新发明轮子,以避免在 Python 2.x 中创建中间列表,只需使用:

    for k, v in d.iteritems():
        print k, v
    

    在 Python 3.x 中使用:

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

    因为该版本中的.items() 方法返回一个可迭代的view 对象。

    【讨论】:

      【解决方案3】:

      这是使用生成器生成键/值对的另一种方法:

      my_dictionary = {
          'foo': [
              1, 2, 3
          ],
          'bar': [
              4, 5, 5
          ]
      }
      
      key_values = ((key, value) for key, value in my_dictionary.items())
      for key, value in key_values:
          print(key, value)
      
      # foo [1, 2, 3]
      # bar [4, 5, 6]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-10-27
        • 1970-01-01
        • 2010-12-28
        • 2022-11-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多