我需要从另一个预定义列表构建所有可能排列的列表。我希望使用列表推导,但我愿意接受其他建议。
我遇到的问题是列表元素的输出可以是任何用户定义的长度正整数,我还没有遇到任何指向我如何自动化的方向(如果它是可能的。
bases = ['A', 'C', 'G', 'T']
因此,如果我想要输出3,我需要
[x+y+z for x in bases for y in bases for z in bases]
如果输出为4,我需要
[w+x+y+z for w in bases for x in bases for y in bases for z in bases]
答案 0 :(得分:6)
import itertools
print(list(itertools.permutations(bases)))
# => [('A', 'C', 'G', 'T'), ('A', 'C', 'T', 'G'), ('A', 'G', 'C', 'T'), ('A', 'G', 'T', 'C'), ('A', 'T', 'C', 'G'), ('A', 'T', 'G', 'C'), ('C', 'A', 'G', 'T'), ('C', 'A', 'T', 'G'), ('C', 'G', 'A', 'T'), ('C', 'G', 'T', 'A'), ('C', 'T', 'A', 'G'), ('C', 'T', 'G', 'A'), ('G', 'A', 'C', 'T'), ('G', 'A', 'T', 'C'), ('G', 'C', 'A', 'T'), ('G', 'C', 'T', 'A'), ('G', 'T', 'A', 'C'), ('G', 'T', 'C', 'A'), ('T', 'A', 'C', 'G'), ('T', 'A', 'G', 'C'), ('T', 'C', 'A', 'G'), ('T', 'C', 'G', 'A'), ('T', 'G', 'A', 'C'), ('T', 'G', 'C', 'A')]
理解是工作的坏工具(至少是他们自己),因为你需要递归(或者至少是递归变平)才能正确处理可变长度列表。
编辑:现在,您的文字显示“排列”,即元素不重复时,只是随机播放。您的代码表明您可能正在考虑笛卡尔积,其中每个位置都是从集合中独立选择的;在这种情况下,您需要itertools.product
:
import itertools
print(list(itertools.product(bases, repeat=3)))
# => [('A', 'A', 'A'), ('A', 'A', 'C'), ('A', 'A', 'G'), ('A', 'A', 'T'), ('A', 'C', 'A'), ('A', 'C', 'C'), ('A', 'C', 'G'), ('A', 'C', 'T'), ('A', 'G', 'A'), ('A', 'G', 'C'), ('A', 'G', 'G'), ('A', 'G', 'T'), ('A', 'T', 'A'), ('A', 'T', 'C'), ('A', 'T', 'G'), ('A', 'T', 'T'), ('C', 'A', 'A'), ('C', 'A', 'C'), ('C', 'A', 'G'), ('C', 'A', 'T'), ('C', 'C', 'A'), ('C', 'C', 'C'), ('C', 'C', 'G'), ('C', 'C', 'T'), ('C', 'G', 'A'), ('C', 'G', 'C'), ('C', 'G', 'G'), ('C', 'G', 'T'), ('C', 'T', 'A'), ('C', 'T', 'C'), ('C', 'T', 'G'), ('C', 'T', 'T'), ('G', 'A', 'A'), ('G', 'A', 'C'), ('G', 'A', 'G'), ('G', 'A', 'T'), ('G', 'C', 'A'), ('G', 'C', 'C'), ('G', 'C', 'G'), ('G', 'C', 'T'), ('G', 'G', 'A'), ('G', 'G', 'C'), ('G', 'G', 'G'), ('G', 'G', 'T'), ('G', 'T', 'A'), ('G', 'T', 'C'), ('G', 'T', 'G'), ('G', 'T', 'T'), ('T', 'A', 'A'), ('T', 'A', 'C'), ('T', 'A', 'G'), ('T', 'A', 'T'), ('T', 'C', 'A'), ('T', 'C', 'C'), ('T', 'C', 'G'), ('T', 'C', 'T'), ('T', 'G', 'A'), ('T', 'G', 'C'), ('T', 'G', 'G'), ('T', 'G', 'T'), ('T', 'T', 'A'), ('T', 'T', 'C'), ('T', 'T', 'G'), ('T', 'T', 'T')]
答案 1 :(得分:0)
如果没有itertools,这是怎么做的。它只是一个递归函数,它返回一个字符串列表。
def product(items, length):
if length == 1:
return items
combos = []
for i in items:
for j in product(items, length-1):
combos.append(i+j)
return combos
print(product('ACGT', 3))
#>>> ['AAA', 'AAC', 'AAG', 'AAT', 'ACA', 'ACC', 'ACG', 'ACT' ...