我希望问题的标题清楚,如果没有,这里是更多详细信息。
lis_a, lis_b, lis_c = ['A', 'C'], ['T', 'G'], ['G', 'T']
# I am trying make combination of these list elements
all_possible_states = [[x, y, z] for x in lis_a for y in lis_b for z in lis_c]
print('all possible states')
输出为:
all possible states
[['A', 'T', 'G'], ['A', 'T', 'T'], ['A', 'G', 'G'], ['A', 'G', 'T'], ['C', 'T', 'G'], ['C', 'T', 'T'], ['C', 'G', 'G'], ['C', 'G', 'T']]
我实际上正在尝试以一种方式将两个互补的组合也组合在一起。即如果从lis_a中选择了“ A”,从lis_b中选择了“ T”,那么从lis_a中选择“ C”,并从lis_b中选择了“ G”将是互补的。
我实际上希望所有可能的状态都采用以下格式,其中两个互补状态嵌套在一起:
[[['A', 'T', 'G'], ['C', 'G', 'T']], [['A', 'T', 'T'], ['C', 'G', 'G']], [['A', 'G', 'G'], [['A', 'G', 'T'], ['C', 'T', 'G']]]
Or,
[(['A', 'T', 'G'], ['C', 'G', 'T']), (['A', 'T', 'T'], ['C', 'G', 'G']), (['A', 'G', 'G'], ['C', 'T', 'T']), (['A', 'G', 'T'], ['C', 'T', 'G'])]
您可以通过规范化每个序列至其自身及其互补序列的最小值来实现。通过采用最小值,可以保证序列及其补码都映射到相同的规范化表示形式。
然后您可以按此分组并找到对。 defaultdict
使分组变得容易。
import collections
import itertools
def canonicalize(seq):
complements = {'A': 'C', 'C': 'A', 'G': 'T', 'T': 'G'}
comp = tuple(complements[o] for o in seq)
return min(seq, comp)
grouped = collections.defaultdict(list)
for seq in itertools.product(lis_a, lis_b, lis_c):
grouped[canonicalize(seq)].append(seq)
list(grouped.values())
# [[('A', 'T', 'G'), ('C', 'G', 'T')],
# [('A', 'T', 'T'), ('C', 'G', 'G')],
# [('A', 'G', 'G'), ('C', 'T', 'T')],
# [('A', 'G', 'T'), ('C', 'T', 'G')]]
看看itertools.combinations:
itertools.combinations(iterable, r)
从输入可迭代返回元素的r长度子序列。
组合以字典顺序排序。因此,如果对可迭代输入进行排序,则将按排序顺序生成组合元组。