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

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脚本说'杀了'.

这可能是由于内存使用不当造成的.有办法解决这个问题吗?

Wil*_*sem 6

你描述的不是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"%t
Run 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 +的列表会导致巨大的内存负担,而当时处理一个元素会有不断的内存使用.