获取没有重复的python列表的所有排列?

时间:2019-12-26 14:47:11

标签: python python-3.x itertools

我正在尝试编写一个获取一组字符串的脚本-

["ab", "ls", "u"]

然后创建它们的所有可能组合,但不一定要全部使用它们。我希望以上示例的可能输出为:


ab
ab ls
ab ls u
ab u ls
ab u

ls
ls ab
ls ab u
ls u ab
ls u

u
u ls
u ls ab
u ab ls
u ab

我的脚本删除了它的其他功能:

stuff = ["ab", "ls", "u"]

for subset in itertools.permutations(stuff):
    concat = ""
    for part in subset:
        concat = concat + part

    #the rest of my script now uses this data

它返回:

ablsu
abuls
lsabu
lsuab
uabls
ulsab

我如何使它返回我想要的东西?

4 个答案:

答案 0 :(得分:2)

您可以一起使用组合和排列。这样应该可以使您前进

a = ["ab", "ls", "u"]
for i in range(1, len(a)+1):
    for comb in combinations(a, i):
        for perm in permutations(comb):
            print(perm)

输出:

('ab',)
('ls',)
('u',)
('ab', 'ls')
('ls', 'ab')
('ab', 'u')
('u', 'ab')
('ls', 'u')
('u', 'ls')
('ab', 'ls', 'u')
('ab', 'u', 'ls')
('ls', 'ab', 'u')
('ls', 'u', 'ab')
('u', 'ab', 'ls')
('u', 'ls', 'ab')

您可以处理comb合适的方式

答案 1 :(得分:2)

当您给出包含3个元素排列的列表时,您将获得所有3个元素的返回结果。 您需要提供1个元素才能获得ab / ls / u的输出。 您需要提供2个元素,才能在输出中获得ab ls / ab u

因此,您可以使用列表中的1/2个元素来调用该程序。

stuff = ["ab", "ls", "u"]

for subset in itertools.permutations(stuff):
    concat = ""
    for part in subset:
        concat = concat + part

    #the rest of my script now uses this data

stuff = ["ab", "ls"]

for subset in itertools.permutations(stuff):
    concat = ""
    for part in subset:
        concat = concat + part


stuff = ["ls", "u"]

for subset in itertools.permutations(stuff):
    concat = ""
    for part in subset:
        concat = concat + part

答案 2 :(得分:1)

stuff = ["ab", "ls", "u"]
final_list = []
for subset in itertools.permutations(stuff):
    concat = ""
    for part in subset:
        concat = concat + part
        final_list.append(concat)

print(final_list)

['ab',
 'abls',
 'ablsu',
 'ab',
 'abu',
 'abuls',
 'ls',
 'lsab',
 'lsabu',
 'ls',
 'lsu',
 'lsuab',
 'u',
 'uab',
 'uabls',
 'u',
 'uls',
 'ulsab']

答案 3 :(得分:0)

()
('ab',)
('ab', 'ls')
('ls', 'ab')
('ab', 'ls', 'u')
('ab', 'u', 'ls')
('ls', 'ab', 'u')
('ls', 'u', 'ab')
('u', 'ab', 'ls')
('u', 'ls', 'ab')

但是此解决方案显示了所有排列::

def solution(ranks)