【问题标题】:How to efficiently iterate over a list in nested defaultdict structure in Python?如何有效地迭代 Python 中嵌套的 defaultdict 结构中的列表?
【发布时间】:2018-03-31 12:51:44
【问题描述】:

我正在处理大量 url(来自计划),并且我将它们分类为嵌套的 defaultdict 结构,如下所示:

我的类别是:

  • 选项:3 种可能性
  • 季度:4 种可能性
  • 周:52 种可能性

周的值应该是一个列表。

我的代码

def setup_urls(option):

    urls = defaultdict(lambda: defaultdict(lambda: defaultdict(list)))

    for quarter in range(1, 5):
        for week in range( 1, 53):
        // logic of computing url goes here
        links[option][quarter][week].append(url)

    return urls

输出

A list with multiple defaultdict in it.

[defaultdict( < function setup_urls. < locals > . < lambda > at 0x7fd30ed2d488 > , {
    'option': defaultdict( < function setup_urls. < locals > . < lambda > . < locals > . < lambda > at 0x7fd3122a2158 > , {
        1: defaultdict( < class 'list' > , {
            45: [ url1, url2, url3, url4, url5 ]
        }),
    })
})]

我不想使用标准字典,因为大型数据集的效率很高。我必须存储大约 5000-10000 个网址。未来可能会在 100000 左右。

根据我自己的一些研究,defaultdict 的使用应该对性能有好处,但是 lambda 的使用似乎不是很 Pythonic。不确定是否有更好的解决方案,但这不是我的主要问题。

我目前如何通过这段代码访问所有 url,但感觉喜欢很多脏代码,特别是一点也不像 Pythonic。

    for dict in result:
        for quarter in dict.values():
            for week in quarter.values():
                for url in week.values():
                    print(url)

我想知道访问这些 url 以利用 map 功能的更好方法是什么? (这是存储 url 的最佳方式吗?)

【问题讨论】:

标签: python list dictionary


【解决方案1】:

您可以通过递归函数为任意级别的嵌套字典构建逻辑。以下是使用itertools.chain 的示例。

from collections import defaultdict
from itertools import chain

def get_values(d, res=[]):
    for k, v in d.items():
        if isinstance(v, dict):
            get_values(v, res=res)
        else:
            res.append(v)
    return list(chain.from_iterable(res))

d = defaultdict(lambda: defaultdict(lambda: defaultdict(list)))

d[1][2][3].append(343)
d[1][2][3].append(1245)
d[1][2][4].append(563)
d[1][2][4].append(763)

res = list(get_values(d))
# [343, 1245, 563, 763]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-17
    • 2023-01-16
    • 2011-10-14
    • 1970-01-01
    • 1970-01-01
    • 2012-01-05
    相关资源
    最近更新 更多