Python中列表从2到N的唯一排列

问题描述 投票:0回答:2

我正在尝试在循环中生成排列列表,并为每次迭代打印,并输出两个以上的结果(或写入文件的行)。

示例输入列表:

['one', 'two', 'three', 'four']

必填输出:

['one', 'two', 'three', 'four']
['two', 'three', 'four']
['one', 'three', 'four']
['one', 'two', 'four']
['one', 'two']
['one', 'three']
['one', 'four']
['two', 'three']
['two', 'four']
['three', 'four']

这是我到目前为止已经完成的工作(很早就在我的Python生活中,请原谅:]

from itertools import permutations

input = ['one', 'two', 'three', 'four']

def convertTuple(tup): 
    str =  ''.join(tup) 
    return str

while (len(input) > 1):    
    permlist = set(permutations(input))
    for i in permlist:
        print(i)
        i = convertTuple(i)
        outfile = open("out.txt", "w")
        outfile.write(i)
    input = input[:-1]
else:
    print("End of permutation cycle")

哪个输出:

('two', 'three', 'one', 'four')
('two', 'four', 'one', 'three')
('three', 'two', 'one', 'four')
('four', 'two', 'one', 'three')
('two', 'one', 'three', 'four')
('two', 'one', 'four', 'three')
('three', 'one', 'four', 'two')
('four', 'one', 'three', 'two')
('one', 'two', 'three', 'four')
('one', 'two', 'four', 'three')
('three', 'four', 'one', 'two')
('four', 'three', 'one', 'two')
('two', 'three', 'four', 'one')
('two', 'four', 'three', 'one')
('three', 'two', 'four', 'one')
('three', 'four', 'two', 'one')
('four', 'two', 'three', 'one')
('four', 'three', 'two', 'one')
('three', 'one', 'two', 'four')
('four', 'one', 'two', 'three')
('one', 'four', 'two', 'three')
('one', 'three', 'two', 'four')
('one', 'three', 'four', 'two')
('one', 'four', 'three', 'two')
('two', 'three', 'one')
('three', 'two', 'one')
('three', 'one', 'two')
('one', 'two', 'three')
('one', 'three', 'two')
('two', 'one', 'three')
('two', 'one')
('one', 'two')
End of permutation cycle

我知道我错了

input = input[:-1]

因为它只是删除了原始列表中的最后一个值,但是我无法弄清楚如何只获取唯一列表,而每个列表中的值数量不同...

我使用的是itertools的错误部分吗?我应该使用组合还是其他方式?

我被严重卡住,所以非常感谢您的帮助!

谢谢!

python loops combinations permutation itertools
2个回答
0
投票

[假设('一个','两个','三个')是您想要的列表中的一个偶然遗漏,这应该可以解决问题:

from itertools import combinations

l = ['one', 'two', 'three', 'four']

for size in range(2,len(l)+1):
    for i in combinations(l,size):
        print(i)

0
投票

我不知道如何只获取唯一列表,每个列表中的值数量不同...我应该使用组合还是其他方法?

是,请使用combinations避免以不同的顺序获得同一组。

我了解input = input[:-1]出了错

右;不要自己从候选集中删除项目。您想要的功能已经内置。

>>> import itertools
>>> help(itertools.combinations)
Help on class combinations in module itertools:

class combinations(builtins.object)
 |  combinations(iterable, r) --> combinations object
 |
 |  Return successive r-length combinations of elements in the iterable.
 |
 |  combinations(range(4), 3) --> (0,1,2), (0,1,3), (0,2,3), (1,2,3)

您需要做的就是提供第二个参数(它也适用于permutations)。无需重复删除元素并找到组合,而仅迭代输出大小的可能值。

(顺便说一下,有一个漂亮的例子in the "recipes" section of the documentation:标记为powerset的那个。集合的power set基本上是您要计算的东西,除了还包括所有一个元素结果和空结果。)

© www.soinside.com 2019 - 2024. All rights reserved.