我正在寻找一种在 Python 中组合多个列表的方法itertools.product 与我想要做的非常接近

问题描述

它可能在 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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...