生成具有可变长度的列表列表的排列

时间:2013-12-02 22:48:56

标签: python

我希望生成所有可能的字符组合,其中字符列表中的每个位置可能有多种选择,也可能没有多种选择。

例如,如果我有列表[['A','G'],['A','C','G'],'T'],我想从中生成['AAT','ACT','AGT','GAT','GCT','GGT']。最好的方法是什么?我过去使用过itertools但是我没有看到任何函数如何处理这种请求。

2 个答案:

答案 0 :(得分:4)

使用itertools.product()

from itertools import product

lsts = [['A', 'G'], ['A', 'C', 'G'], 'T']
output = [''.join(combo) for combo in product(*lsts)]

*lsts语法将lsts中的每个元素作为单独的参数应用于products()函数;好像你打电话给product(['A', 'G'], ['A', 'C', 'G'], 'T')

演示:

>>> from itertools import product
>>> lsts = [['A','G'],['A','C','G'],'T']
>>> [''.join(combo) for combo in product(*lsts)]
['AAT', 'ACT', 'AGT', 'GAT', 'GCT', 'GGT']

您可以将嵌套列表缩减为相同输出的字符串:

lsts = ['AG', 'ACG','T']

或者,为了保持一致性,将最后一个元素设为列表:

lsts = [['A', 'G'], ['A', 'C', 'G'], ['T']]

但它也适用于混合序列。

答案 1 :(得分:1)

首先,您应该使用['T']代替'T'

使您的列表更齐)(列表列表)
>>> import itertools
>>> L = [['A','G'],['A','C','G'],['T']]
>>> [''.join(x) for x in itertools.product(*L)]
['AAT', 'ACT', 'AGT', 'GAT', 'GCT', 'GGT']

迭代字符串'T'也有效,但它可能会导致我体验中的其他错误