每个位置受限的Python排列

0 投票
1 回答
660 浏览
提问于 2025-04-18 18:27

我正在学习如何生成一个字符串的所有排列,但每个位置的选择是有限制的——这就像是排列的排列。

我需要长度为8的字符串,比如第一个位置可以是'A'、'G'或'T',而第三个位置只能是'A',依此类推。

就像这样:

 Pos:  1 2 3 4 5 6 7 8

       A A A     A   A
       G G   G G G G G
       T T           T

一个示例输出是 'AGAGGGGT'

根据我的计算,这应该能产生 3*3*1*1*1*2*1*3 = 54 种不同的变体。

我尝试过以下方法,但没有成功:

import itertools

print list(itertools.permutations([['A','G','T']['A','G','T']['A']['G']['G']['A','G']['G']['A','G','T']], 8))

不过我想这应该是类似这样的思路。

1 个回答

1

我觉得你在找的是 itertools.product 这个东西:

In [83]: import itertools as IT

In [93]: IT.product('AGT', 'AGT', 'A', 'G', 'G', 'AG', 'G', 'AGT')
Out[93]: <itertools.product at 0xba654b4>

In [94]: len(list(IT.product('AGT', 'AGT', 'A', 'G', 'G', 'AG', 'G', 'AGT')))
Out[94]: 54

IT.product 会返回一个元组的迭代器。要把这些元组转换成字符串,你可以在列表推导式中使用 ''.join

In [96]: [''.join(item) for item in IT.product('AGT', 'AGT', 'A', 'G', 'G', 'AG', 'G', 'AGT')]

撰写回答