查找两个序列 (String) Python 的唯一组合

Finding unique combinations of two sequence (String) Python

提问人:Théo Durand 提问时间:3/28/2023 更新时间:3/28/2023 访问量:81

问:

你好,我有一个问题。

我有两个这样的列表:

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

list2 = ['G','A','*','T','AC','A']

我想在 python 中找到这两个序列的所有可能的组合。

例如,结果将是:

(GCATCA), (GA*TACA), (GAATCA), (GA*TCA), (GC*TCA), (GC*TACA), (GCATACA), (GAATACA)

谢谢你的回答

python-3.x 列表 序列 生物信息学

评论

2赞 Cow 3/28/2023
请编辑您的问题并包含您尝试过的代码,然后我们可以帮助您解决您可能遇到的任何问题。
0赞 darked89 3/28/2023
您将列表2中的“AC”视为单个碱基?顺便说一句,假设在给定位置,您从其中一个列表中获取一个值,第一个和最后一个碱基是固定的(G 和 A),因此您只需要使用 [1:-1] 元素。
1赞 Xenobiologist 3/28/2023
为什么两个列表而不仅仅是 list1 = ['G','C','A','T','C','A', '*', 'AC']

答:

3赞 Jorge Luis 3/28/2023 #1

首先,让我们获取每个位置的所有货币对:

pairs = zip(list1, list2)

现在让我们为每个位置的每个选择做一个组合。 为此,我们将使用 itertools.product

from itertools import product

combinations = product(*zip(list1, list2))

让我们摆脱所有重复的组合。

unique_combinations = set(combinations)

最后,让我们将每个组合连接在一个字符串中:

all_combinations = [''.join(bases) for bases in unique_combinations]

以下是所需的输出:。当然,您可以在一行中获取它:all_combinations['GC*TCA', 'GC*TACA', 'GCATCA', 'GAATACA', 'GCATACA', 'GA*TACA', 'GAATCA', 'GA*TCA'][''.join(bases) for bases in set(product(*zip(list1, list2)))]

3赞 Kelly Bundy 3/28/2023 #2

就像豪尔赫·路易斯(Jorge Luis)的回答一样,但也在每个位置更早地删除了重复数据。然后我们只直接生产 8 种组合,而不是生产 64 种并扔掉其中的 56 种。

from itertools import product

list1 = ['G','C','A','T','C','A']
list2 = ['G','A','*','T','AC','A']

result = {*map(''.join, product(*map(set, zip(list1, list2))))}

print(result)

输出(在线尝试!

{'GAATCA', 'GA*TCA', 'GA*TACA', 'GC*TACA',
 'GCATACA', 'GC*TCA', 'GCATCA', 'GAATACA'}

或者,不使用 itertools:

list1 = ['G','C','A','T','C','A']
list2 = ['G','A','*','T','AC','A']

result = {''}
for pair in zip(list1, list2):
    result = {
        r + p
        for p in set(pair)
        for r in result
    }

print(result)

在线尝试!