具有可变长度输出的列表理解

Kyr*_*bas 0 python list-comprehension

我需要从另一个预定义列表构建所有可能排列的列表.我希望使用列表推导,但我愿意接受其他建议.

我遇到的问题是列表元素的输出可以是任何用户定义的长度正整数,我还没有遇到任何指向我如何自动化的方法(如果可能的话) .

bases = ['A', 'C', 'G', 'T']
Run Code Online (Sandbox Code Playgroud)

所以,如果我想要3的输出,我需要

[x+y+z for x in bases for y in bases for z in bases]
Run Code Online (Sandbox Code Playgroud)

我需要输出4

[w+x+y+z for w in bases for x in bases for y in bases for z in bases]
Run Code Online (Sandbox Code Playgroud)

Ama*_*dan 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')]
Run Code Online (Sandbox Code Playgroud)

理解是工作的坏工具(至少是自己),因为你需要递归(或者至少是递归变平)才能正确地处理可变长度列表.

编辑:现在,你的文字说"排列",这是元素不重复,只是洗牌.您的代码表明您可能正在考虑笛卡尔积,其中每个位置都是从集合中独立选择的; 在这种情况下你想要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')]
Run Code Online (Sandbox Code Playgroud)