如何在Python中嵌套的defaultdict结构中有效地迭代列表?

时间:2018-03-31 12:51:44

标签: python list dictionary

我正在处理大量的网址(来自日程表),我将它们分类为嵌套的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。不确定是否有更好的解决方案,但这不是我的主要问题。

我目前如何使用这段代码访问所有网址,但感觉很多脏代码,特别是不是很好的Pythonic。

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

我想知道访问这些网址以便使用地图功能的更好方法是什么? (这是存储网址的最佳方式吗?)

1 个答案:

答案 0 :(得分:0)

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