如何在Python中嵌套的默认属性结构中有效迭代列表



我正在处理大量URL(根据时间表(,并且我将它们分类为嵌套的默认结构,如下所示:

我的类别是:

  • 选项: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个URL。将来这可能是100000。

在我自己的一些研究中,违约的用法应该对性能有益,但是Lambda的用法似乎并不是很好的Pythonic。不知道是否有更好的解决方案,但这不是我的主要问题。

i当前该代码如何访问所有URL,但感觉喜欢很多肮脏的代码,特别是Pythonic。

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

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

您可以通过递归函数为任意水平的嵌套字典构建逻辑。以下是使用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]

最新更新