我正在处理大量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]