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

bad*_*ner 2 python python-itertools

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

所以我的数据是这样的:

aa aa aa aa aa
ab ac aa ad ae
aa ab af ae ag
Run Code Online (Sandbox Code Playgroud)

我想获得所有可能的有序组合

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...
Run Code Online (Sandbox Code Playgroud)

我尝试了 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'))
Run Code Online (Sandbox Code Playgroud)

我用 10 测试了它以确保它不会爆炸,但这似乎不像我想象的那样工作。如果我放 5,它只会给我与以前相同的列表。有没有办法做到这一点?

leu*_*s95 5

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 “返回的项目数为 n!/(nr)!当 0 <= r <= n 或 r > 时为零n."