如何获取列表的所有可能排列顺序

3

我有5个垂直字符串,它们是按照分类器的概率顺序生成的。如果分类器的置信度非常高,我想保留该分类,但对于低置信度的分类,我希望在所有可能的组合顺序之间变化,创建一个包含所有可能垂直字符串的列表。

因此,我的数据看起来像这样:

aa aa aa aa aa
ab ac aa ad ae
aa ab af ae ag

我希望能够获得所有可能的有序组合。

aa aa aa aa aa aa aa aa aa aa ...
ab ac aa ad ae ae ab ac aa ad ...
aa ab af ae ag aa ab af ae ag...

我尝试使用itertools,但似乎找不到合适的工具来做这件事。有人知道如何做吗?

目前我尝试过以下方法:

import sys
import os
import itertools
from itertools import permutations

in_file = sys.argv[1]

f1 = open(in_file, 'r')

new_lines = []

for line in f1.readlines():
    line = line.strip()
    do stuff to replace my higher confidence matches...
        new_lines.append(line)

for x in new_lines:
    for a,b,c,d,e,f,g,h,i,j in permutations(x.split(), 10):
        print '{} {} {} {} {} {} {} {} {} {}'.format(a.rstrip('\n'), b.rstrip('\n'), c.rstrip('\n'), d.rstrip('\n'), e.rstrip('\n'), f.rstrip('\n'), g.rstrip('\n'), h.rstrip('\n'), i.rstrip('\n'), j.rstrip('\n'))

我用10进行测试来确保它不会崩溃,但是这似乎并没有按照我想象中的方式工作。如果我放置5,它只是给我之前相同的列表。有没有办法可以做到这一点?


所以确认一下,您想要从5个输入中选择10个对象的每个可能的唯一序列是吗? - leumas95
1
你可以使用 itertools.product 并按此链接进行操作。 - Gleland
@leumas95。我只是放了一个10来停止它。我真的想要每个5元素列表的所有可能顺序。 - badner
@Gleland,我不这么认为,因为每行只有5个元素而不是两个列表...但它正在朝着这个方向发展。 - badner
@badner 我看得出你在做什么,这个限制是针对每个排列的长度而非个别排列的数量。 - leumas95
1个回答

8
Python的itertools.permutations方法接受一个可迭代对象和一个整数限制(r)作为参数。
整数用于限制每个排列的长度,例如,如果您有一个排列列表([1, 2, 3], 2)将给出[(1, 2),(1, 3),(2, 1),(2, 3),(3, 1),(3, 2)]。
限制不能大于输入列表的长度,否则将返回空的可迭代对象。
参见https://docs.python.org/2/library/itertools.html#itertools.permutations,特别是“当0 <= r <= n时,返回的项数为n! / (n-r)!;当r > n时,返回零”。

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