问题描述
它可能在 Google 上,但我很难用语言表达我想要做的事情。 itertools.product 很接近,但我也希望它给我更小的组合,而 itertools 只提供所有列表的组合。用一个例子来解释可能更容易:
我想合并的列表示例: [[a,b,c],[d,e,f],[g,h,i]]
Itertools 回馈: [a,d,g],[a,h]....[c,f,h],[c,i](27 个结果)
[a,d],e],[b,i],[e,[f,[ f,i]
总共会有 45 个结果。请注意,我只是在寻找彼此相邻的列表之间的组合(不想返回 [a,g])。列表也不会这么简单,会有 10 个列表,每个列表 3-4 个字符。
我唯一的代码行是: 列表(itertools.product(*thelist))]。我只是不知道接下来我要在这里做什么。我感觉有一些方法可以用 itertools 来做到这一点,我就是想不通。
解决方法
在我看来,您想在列表列表的每个子列表上运行 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 个元组的列表,其中似乎包含您要查找的所有项目。
,您有前 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'),'f'),('b',('c',('d','g'),'h'),'i'),('e',('f','i')]
,
使用来自 HERE 的非常聪明的位检查方法
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