我正在寻找一种在 Python 中组合多个列表的方法(itertools.product 非常接近我正在尝试做的事情)
I'm looking for a way to combine multiple lists in Python (itertools.product is very close to what I'm trying to do)
它可能在 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])。列表也不会这么简单,会有一组 10 个列表,每个列表有 3-4 个字符。
我唯一的代码行是:
列表(itertools.product(*列表))]。我只是不知道下一步该去哪里做我想在这里做的事情。我觉得有一些方法可以用 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'), ('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')]
使用来自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
它可能在 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])。列表也不会这么简单,会有一组 10 个列表,每个列表有 3-4 个字符。
我唯一的代码行是: 列表(itertools.product(*列表))]。我只是不知道下一步该去哪里做我想在这里做的事情。我觉得有一些方法可以用 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'), ('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')]
使用来自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