我正在尝试在循环中生成排列列表,并为每次迭代打印,并输出两个以上的结果(或写入文件的行)。
示例输入列表:
['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的错误部分吗?我应该使用组合还是其他方式?
我被严重卡住,所以非常感谢您的帮助!
谢谢!
[假设('一个','两个','三个')是您想要的列表中的一个偶然遗漏,这应该可以解决问题:
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)
我不知道如何只获取唯一列表,每个列表中的值数量不同...我应该使用组合还是其他方法?
是,请使用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基本上是您要计算的东西,除了还包括所有一个元素结果和空结果。)