生成一个字符串列表所有排列的方法

4

我有一个字符串列表:['red','blue','pink'],我想生成给定列表元素的所有排列组合列表,如下所示:

['red', 'redblue', 'redbluepink', 'redpinkblue',
 'blue', 'bluered', 'bluepink', 'blueredpink', 'bluepinkred',
 'pink', 'pinkred', 'pinkblue', 'pinkredblue', 'pinkbluered']

我已经成功编写了以下代码,用于生成列表元素的所有正向排列:

from itertools import combinations

def all_permutations(list_of_strings):
    results = [''.join(list_of_strings[i:j]) for i, j in combinations(range(len(list_of_strings) + 1), 2)]

    return results

print(all_permutations(['red','blue','pink']))

然而,这段代码只能生成所有正向排列:
['red', 'redblue', 'redbluepink', 'blue', 'bluepink', 'pink']

有没有人能帮我找出一种方法,可以生成由字符串列表中元素的所有排列组合?


你可以通过循环颜色的长度,即 i in [1, 2, 3],然后链接 map(permutations, combinations(colors, i)) - a_guest
为什么redpink不在你的预期输出中? - cody
@cody 我一定是忘记在我的预期输出列表中添加了它。 - Manas Chaturvedi
2个回答

3
您可以使用第二个参数r来调用itertools.permutations函数来获取所需的迭代器:
from itertools import permutations

def all_permutations(x):
    for r in range(1, len(x) + 1):
        yield from permutations(x, r)

合并结果:

[''.join(s) for s in all_permutations(['red', 'blue', 'pink'])]

或者

map(''.join, all_permutations(['red', 'blue', 'pink']))

这将会给你一个与问题中不同的顺序。你可以通过按照你原始列表中的索引排序来强制执行所需的顺序:
items = ['red', 'blue', 'pink']
index = {k: i for i, k in enumerate(items)}
all_items = sorted(all_permutations(items), key=lambda item: tuple(index[x] for x in item))
all_items = [''.join(item) for item in all_items]

2
以下解决方案可能满足您的需求。您的解决方案使用了 itertools.combinations,而排列和组合之间的关键区别在于组合中顺序不重要,因此'redblue''bluered' 不会被视为唯一。
from itertools import permutations

def all_permutations(l):
    o = []
    for x in range(1, len(l) + 1):
        o.extend([''.join(p) for p in list(permutations(l, x))])
    return o

colors = ['red', 'blue', 'pink']

print(all_permutations(colors))

结果:

['red', 'blue', 'pink', 'redblue', 'redpink', 'bluered', 'bluepink', 'pinkred', 'pinkblue', 'redbluepink', 'redpinkblue', 'blueredpink', 'bluepinkred', 'pinkredblue', 'pinkbluered']

@MadPhysicist 没问题.. 你的解决方案比我的更优雅,但我还是会把它留在这里,作为对比.. 哈哈 - cody
你比我先完成了,而且解决方案也完全一样。我同意你应该保留它。+1 - Mad Physicist

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