uzv*_*ver 0 python python-itertools large-data python-3.x
我有一个大字典:600个键,项目=大列表(约10000-20000元素).
我的目标是从dict中的每个列表中获取对,并将其合并到一个列表中.
我有:
d1 = {'key1': ['a', 'b', 'c', 'd'], 'key2': ['f', 'a']}
Run Code Online (Sandbox Code Playgroud)
预期结果:
d2 = ['a_b', 'a_c', 'a_d', 'b_c', 'b_d', 'c_d', 'a_f']
Run Code Online (Sandbox Code Playgroud)
我的代码:
d2 = []
for k, v in d1.items():
for i, j in itertools.product(v, v):
if i>j:
a = "_".join(list(set([i, j])))
d2.append(a)
Run Code Online (Sandbox Code Playgroud)
我有一个问题:在终端我的python脚本说'杀了'.
这可能是由于内存使用不当造成的.有办法解决这个问题吗?
你描述的不是product,但是combinations.
此外,如果内存是一个问题,你最好使用一个生成器,所以:
from itertools import combinations
def dic_comb_generator(d1):
for v in d1.values():
for t in combinations(sorted(v),2):
yield "%s_%s"%tRun Code Online (Sandbox Code Playgroud)
这里我们sorted(..)首先对元素进行排序,v以便对结果元组进行排序.如果您不希望对组合进行排序,但是按列表的顺序进行排序,则应删除该sorted(..)功能.此外,我们使用,2因为我们构造了具有两个元素的组合(元组).
如果我们实现输出,我们得到:
>>> list(dic_comb_generator({'key1': ['a', 'b', 'c', 'd'], 'key2': ['f', 'a']}))
['a_b', 'a_c', 'a_d', 'b_c', 'b_d', 'c_d', 'a_f']
Run Code Online (Sandbox Code Playgroud)
但是如果你在for循环中使用生成器,比如:
for elem in dic_comb_generator(d1):
print(elem)
Run Code Online (Sandbox Code Playgroud)
Python 不会构造包含所有元素的列表:将生成所有元素,但如果不存储它们,则用于第一个项目的内存可以重用于第二个项目.特别是在产品,组合......的情况下,元素的数量可能很大,这可以得到回报:存储100M +的列表会导致巨大的内存负担,而当时处理一个元素会有不断的内存使用.