如何对列表元素进行嵌套和分组组合?

问题描述 投票:0回答:2

我希望问题的标题清楚,如果没有,这里是更多详细信息。

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'])]
python list list-comprehension combinations permutation
2个回答
1
投票

您可以通过规范化每个序列至其自身及其互补序列的最小值来实现。通过采用最小值,可以保证序列及其补码都映射到相同的规范化表示形式。

然后您可以按此分组并找到对。 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')]]

-1
投票

看看itertools.combinations:

itertools.combinations(iterable, r)

从输入可迭代返回元素的r长度子序列。

组合以字典顺序排序。因此,如果对可迭代输入进行排序,则将按排序顺序生成组合元组。

© www.soinside.com 2019 - 2024. All rights reserved.