从python中的列表生成所有可能的2和3字符串组合

时间:2016-11-21 11:44:26

标签: python list combinations

我有以下列表:

mylist = ['car', 'truck', 'ship']

目前,我只能使用此功能获得2个字符串的所有可能组合:

from itertools import combinations
print(list(combinations(mylist,2)))

给了我:

[('car', 'truck'), ('car', 'ship'), ('truck', 'ship')]

然而,一个组合实际上是所有3个字符串。因此,我希望我的结果是:

[('car', 'truck'), ('car', 'ship'), ('truck', 'ship'), ('car', 'truck', 'ship')]

4 个答案:

答案 0 :(得分:5)

这是powerset的调整案例。通常,Python中的powerset代码如下所示:

from itertools import chain, combinations

def powerset(it):
    yield from chain.from_iterable(combinations(it, r) for r in range(len(it)+1))

但是,您可以将其更改为仅接受特定范围内的结果。在你的情况下,从2到3:

from itertools import chain, combinations

def adjusted_powerset(it):
    yield from chain.from_iterable(combinations(it, r) for r in range(2, 3))

在行动here中查看。

如果您需要更加通用,请使用range参数。一个很好的模板是创建一个powerset帮助器:

from itertools import chain, combinations

def powerset_helper(it, start, stop):
    yield from chain.from_iterable(combinations(it, r) for r in range(start, stop+1))

def powerset(it):
    yield from powerset_helper(it, 0, len(it))

def adjusted_powerset(it):
    yield from powerset_helper(it, 2, 3)

答案 1 :(得分:4)

这个怎么样,

from itertools import combinations

mylist = ['car', 'truck', 'ship']
result = list()

for r in [2, 3]:
    result.extend(combinations(mylist, r))

print(result)
[('car', 'truck'), ('car', 'ship'), ('truck', 'ship'), ('car', 'truck', 'ship')]

答案 2 :(得分:3)

实际上,另一种组合是只包含一个单词的集合,以及空集。所有可能组合的集合 n为所有* 0< = k< = n *选择k 被称为集合的 powerset

itertools 的文档页面提供了如何生成它的示例。我稍微修改了它以接受 minlength 变量(在你的情况下 minlength = 2

def powerset(iterable, minlength=0):
    "powerset([1,2,3]) --> () (1,) (2,) (3,) (1,2) (1,3) (2,3) (1,2,3)"
    s = list(iterable)
    return chain.from_iterable(combinations(s, r) for r in range(minlength, len(s)+1))

答案 3 :(得分:1)

itertools.combinations支持列表长度作为输入参数。

def combinations(iterable, r):
    # combinations('ABCD', 2) --> AB AC AD BC BD CD
    # combinations(range(4), 3) --> 012 013 023 123
    pool = tuple(iterable)
    n = len(pool)
    if r > n:
        return
    indices = range(r)
    yield tuple(pool[i] for i in indices)
    while True:
        for i in reversed(range(r)):
            if indices[i] != i + n - r:
                break
        else:
            return
        indices[i] += 1
        for j in range(i+1, r):
            indices[j] = indices[j-1] + 1
        yield tuple(pool[i] for i in indices)

对于您的情况,只需将2字符串和3字符串一起添加:

from itertools import combinations
print(list(combinations(mylist,2)) + list(combinations(mylist,3)))