Python 从多个大列表中获取所有可能的对
我有一个很大的dict:600个键,其中items=大列表(大约10000-20000个元素) 我的目标是从dict中的每个列表中获取成对的数据,并将其合并到一个列表中 例如,我有:Python 从多个大列表中获取所有可能的对,python,python-3.x,itertools,large-data,Python,Python 3.x,Itertools,Large Data,我有一个很大的dict:600个键,其中items=大列表(大约10000-20000个元素) 我的目标是从dict中的每个列表中获取成对的数据,并将其合并到一个列表中 例如,我有: d1 = {'key1': ['a', 'b', 'c', 'd'], 'key2': ['f', 'a']} 预期结果: d2 = ['a_b', 'a_c', 'a_d', 'b_c', 'b_d', 'c_d', 'a_f'] 我的代码: d2 = [] for k, v in d1.items():
d1 = {'key1': ['a', 'b', 'c', 'd'], 'key2': ['f', 'a']}
预期结果:
d2 = ['a_b', 'a_c', 'a_d', 'b_c', 'b_d', 'c_d', 'a_f']
我的代码:
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)
我有一个问题:在终端,我的python脚本说“Killed”
这可能是由于内存使用不当造成的。有没有办法解决这个问题 您所描述的不是
产品
,而是组合
此外如果内存有问题,最好使用生成器,以便:
from itertools import combinations
def dic_comb_generator(d1):
for v in d1.values():
for t in combinations(sorted(v),2):
yield "%s_%s"%t
但是,如果在for
循环中使用生成器,例如:
for elem in dic_comb_generator(d1):
print(elem)
Python将不构建包含所有元素的列表:将生成所有元素,但如果不存储它们,则用于发出的第一项的内存可用于第二项。特别是在产品、组合,。。。如果元素的数量可能很大,这是值得的:存储一个超过100万个元素的列表会带来巨大的内存负担,而一次处理一个元素会持续占用内存。您可以这样做:
import itertools as it
for l in d1.values():
for t in it.combinations(sorted(l), 2):
print("_".join(t))
显示:
a_b
a_c
a_d
b_c
b_d
c_d
a_f
注意:如果不希望对其进行排序,只需取出
sorted
函数调用。您可以创建一个不涉及itertools
的生成器:
def dic_comb_generator(d):
for val in d.values():
v = sorted(val)
for i in range(len(v)):
for j in range(i+1, len(v)):
yield v[i] + '_' + v[j]
如果OP不希望它像那样排序呢?a、 b,c,d只是一个代表性的例子,但是如果输入是w,g,k,l怎么办?@Coldspeed在他的示例代码中有一个
if i>j
子句,使我认为他想要对它进行排序。但我要补充一点。谢谢你的关注。非常感谢!那么如何将计数器应用于生成器?@uzver:简单地计数器(dic_comb_generator(d1))
@uzver:那么不同元素的数量太多了。你得用另一种方法数一数。
def dic_comb_generator(d):
for val in d.values():
v = sorted(val)
for i in range(len(v)):
for j in range(i+1, len(v)):
yield v[i] + '_' + v[j]