Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从多个大列表中获取所有可能的对_Python_Python 3.x_Itertools_Large Data - Fatal编程技术网

Python 从多个大列表中获取所有可能的对

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():

我有一个很大的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():
    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]