生成一个潜在的8个字符字符串的所有可能的2个字符组合?

4
我需要生成一个由元组组成的元组的所有可能组合。
( (base1 , position1) , (base2 , position2) )

这里有一个列表 bases = ["U", "C", "A", "G"] 和一个位置列表 positions = [0,1,2,3,4,5,6,7,8].

要求:

  • 不重复
  • 碱基可以相同,但是位置必须不同
  • 顺序不能打乱。

例如:

( (A,1), (B,2) ) == ( (B,2) , (A,1) ) ,而( (A,1), (B,1) ) 应该被放弃。

示例输出:

[ ( (U,0) , (U,1) ), ( (U,0) , (U,2) ), ( (U,0) , (U,3) ) ...]

应该有448个元素


例子:

对于长度为2的字符串:

((U,0),(U,1))
((U,0),(C,1))
((U,0),(A,1))
((U,0),(G,1))

((C,0),(U,1))
((C,0),(C,1))
((C,0),(A,1))
((C,0),(G,1))

((A,0),(U,1))
((A,0),(C,1))
((A,0),(A,1))
((A,0),(G,1))

((G,0),(U,1))
((G,0),(C,1))
((G,0),(A,1))
((G,0),(G,1))

我已经有了这个内容,应该包含所有的组合...我认为。

到目前为止,我只有这些。

all_possible = []
nucleotides = ["U","C","A","G"]


for i in range(len(nucleotides)):
    for j in range(8):
        all_possible.append(((nucleotides[i],j),(nucleotides[i],j)))

5
你能说明一下问题吗?具体地,输出结果是什么样子?我甚至不确定你的示例想要说明什么。 - Jeremy West
3
我不确定你的确切问题是什么,但itertools几乎肯定有一些能够帮助你解决这个问题的内容:https://docs.python.org/3/library/itertools.html - Jack
使用您提供的“bases”和“positions”列表,len([((b1, p1), (b2, p2)) for (b1, b2) in product(bases, bases) for (p1, p2) in combinations(positions, 2)]) 的结果为576,而不是448。我认为您的“positions”列表太长了。 - bli
1个回答

5

听起来你想要每个2进制单词与range(8)中的每个2组合的笛卡尔积。

你可以通过以下方式得到:

from itertools import product, combinations

def build(num_chars, length):
    bases = ["U", "C", "A", "G"]
    for letters in product(bases, repeat=num_chars):
        for positions in combinations(range(length), num_chars):
            yield list(zip(letters, positions))

这给我们提供了

In [4]: output = list(build(2, 8))

In [5]: len(output)
Out[5]: 448

In [6]: output[:4]
Out[6]: 
[[('U', 0), ('U', 1)],
 [('U', 0), ('U', 2)],
 [('U', 0), ('U', 3)],
 [('U', 0), ('U', 4)]]

In [7]: output[-4:]
Out[7]: 
[[('G', 4), ('G', 7)],
 [('G', 5), ('G', 6)],
 [('G', 5), ('G', 7)],
 [('G', 6), ('G', 7)]]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接