我正在处理大量的网址(来自日程表),我将它们分类为嵌套的defaultdict结构,如下所示:
我的分类是:
周数值应该是一个列表。
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)
我想知道访问这些网址以便使用地图功能的更好方法是什么? (这是存储网址的最佳方式吗?)
答案 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]