如何获取我的列表的一些子集的笛卡尔积,以及整个列表的列表积?

4

这可能可以在Google上找到,但我很难用语言表达我想做的事情。itertools.product 已经接近了,但我也想要更小的组合,而 itertools 只能给出所有列表的组合。以示例形式解释可能会更容易:

我想要组合的列表示例: [[a,b,c],[d,e,f],[g,h,i]]

Itertools 给出的结果是: [a,d,g],[a,d,h]....[c,f,h],[c,f,i] (27 个结果)

我需要的输出是: 上述内容加上:

[a,d],[a,e],[a,f],[b,d],[b,e],[b,f],[c,d],[c,e],[c,f],[d,g],[d,h],[d,i],[e,g],[e,h],[e,i],[f,g],[f,h],[f,i]

总共会有 45 个结果。请注意,我只想要相邻列表之间的组合(不想返回 [a,g])。列表也不会这么简单,将有一组包含每个 3-4 个字符的 10 个列表。

我对此的唯一一行代码是: list(itertools.product(*thelist))。我只是不知道下一步应该怎么做。我有一种感觉可以通过 itertools 实现这个功能,但我无法理解。


1
你尝试过使用 itertools.combinations 吗? - mkrieger1
我尝试了一下,但是遇到了困难,也许没有正确地使用2D列表。我将继续尝试itertools.combinations。 - SCAND1UM
3个回答

2
你已经有了前27个,这里是如何获得另外18个的方法:
import itertools as it
lst = [['a','b','c'],['d','e','f'],['g','h','i']]

result = [it.product(lst[i], lst[i+1]) for i in range(len(lst)-1)]
result = list(it.chain.from_iterable(result))

print(result)
#[('a', 'd'), ('a', 'e'), ('a', 'f'), ('b', 'd'), ('b', 'e'), ('b', 'f'), ('c', 'd'), ('c', 'e'), ('c', 'f'), ('d', 'g'), ('d', 'h'), ('d', 'i'), ('e', 'g'), ('e', 'h'), ('e', 'i'), ('f', 'g'), ('f', 'h'), ('f', 'i')]

2

我认为你想在列表中的每个子列表上运行 itertools.product,并将结果连接在一起。

以下代码是否符合你的需求?

import itertools

def combine(lists, min_length):
    items = []
    for start in range(len(lists)):
        for end in range(start + min_length, len(lists) + 1):
            items.extend(itertools.product(*lists[start:end]))
            
    return items

我使用以下方式调用了这个函数:
combine([["a","b","c"],["d","e","f"],["g","h","i"]], 2)

它返回了一个包含45个元组的列表,看起来包含了你要查找的所有项目。


2

使用了一个相当巧妙的位检查方法,来源于这里

from itertools import product

x = ('abc', 'def', 'ghi')

def subsets(s):
    sets = []
    for i in range(1, 1 << len(s)):
        if bin(i).count("1") != 1 and '11' in bin(i):
            subset = [s[bit] for bit in range(len(s)) if is_bit_set(i, bit)]
            sets.append(subset)
    return sets

def is_bit_set(num, bit):
    return num & (1 << bit) > 0

a = 0
super_sets = subsets(x)
for sset in super_sets:
    a += len(list(product(*sset)))
    #print(list(product(*sset)))
print(a)

54


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接