2017-07-26 71 views
0

我有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,但我似乎无法找到合适的工具去做这个。有谁知道如何做到这一点?

[更新]

这是我到目前为止已经试过:

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')) 
+0

它看起来像你想[itertools.permutations](https://docs.python.org/2/library/itertools.html?highlight=permutations#itertools.permutations)函数。 –

+0

@MikeRobins,是的,这是我一直在尝试itertools。我放10,所以它不会爆炸,但输出是空的。如果我做5它工作 – badner

+0

5元素集没有10个元素排列,所以空输出听起来是正确的。此外,我建议如果你发现自己输入重复使用循环和列表的代码。 –

回答

1

看来你想要的三重组合与替换字符串"aa ab ac ad ae af ag",排除项,所有的元素都是平等的。

代码

import itertools as it 


iterable = "aa ab ac ad ae af ag".split() 

combs = it.combinations_with_replacement(iterable, 3) 
pred = lambda x: len(set(x)) != 1 
results = list(filter(pred, combs)) 
transposed = list(zip(*results)) 

演示

>>> for line in transposed: 
...  print(line) 
('aa', 'aa', 'aa', 'aa', 'aa', 'aa', 'aa', 'aa', 'aa', 'aa', 'aa', ...) 
('aa', 'aa', 'aa', 'aa', 'aa', 'aa', 'ab', 'ab', 'ab', 'ab', 'ab', ...) 
('ab', 'ac', 'ad', 'ae', 'af', 'ag', 'ab', 'ac', 'ad', 'ae', 'af', ...) 

选项

您可以在同一行简化此代码作为发电机:

transposed = zip(*(i for i in it.combinations_with_replacement(iterable, 3) if len(set(i)) != 1))