【问题标题】:Iterator for both lists and dictionaries列表和字典的迭代器
【发布时间】:2012-04-01 23:11:03
【问题描述】:

我有一个参数字典,其中包含由字符串、列表和其他字典组成的复杂数据。现在我想遍历这些数据。

我的问题是使用迭代器的方式 - 最佳实践 - 可以迭代列表和字典。

我有什么:

def parse_data(key, value):
    iterator = None

    if isinstance(value, dict):
        iterator = value.items()
    elif isinstance(value, list):
        iterator = enumerate(value)

    if iterator is not None:
        for key, item in iterator:
            parse_data(key, item)
        return

    # do some cool stuff with the rest

这看起来不太像pythonish。我想到了一个类似于 iter 的函数,让我可以遍历 key 和 item。

希望您能提供帮助。
非常感谢。

【问题讨论】:

  • 我看不出你的做法有什么问题。
  • @CharlesBrunet 我想到了一个典型的蟒蛇式坏蛋技巧来缩短我还不知道的所有内容。

标签: python iterator python-3.x


【解决方案1】:

我认为这很pythonic。我只是将其更改为:

def parse_data:

    if isinstance(value, dict):
        iterator = value.items()
    elif isinstance(value, list):
        iterator = enumerate(value)
    else:
        return

    for key, item in iterator:
        parse_data(value, key, item)

    # do some cool stuff with the rest

【讨论】:

  • 有了这个,# do some cool stuff with the rest 永远不会被调用。
  • 什么?当然如此。唯一过早的return 只有在value 的类型不合适时才会生效。
  • 我在代码中使用此注释的想法是在我处理其他类型值(例如字符串)的地方签名。这就是为什么我使用iterator = None 来初始化没有太复杂的条件结构的原因。但无论如何你都有权。
【解决方案2】:

我不确定是否有更短的方法来做这件事,但是 Python 被构建为以多种不同的方式做一件事。也许这可能是另一种方式。我没有测试它,所以它可能不起作用。

def parse_data(key,value):
    iterator = isinstance(value,dict) 

    if iterator is False and isinstance(value,list):
        iterator = enumerate(value)

    if iterator is not None: 
        for key,item in iterator: 
            parse_data(key,item) 
        return      

    #do some cool stuff with the rest 

【讨论】:

  • 我编辑了我的问题。只是忘记了parse_data 的论点。我使用了一个独立的函数来显示我的问题。
  • 我改变了我的代码,它并不是真的更短,但可能是一种不同的方式。
  • 看起来很有希望。将对其进行测试。
  • 实际上我猜它短了几行。让我知道它是否适合您。
  • 你想用dict.get实现什么?我只能在字典实例上调用get。这不是静态方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多