2013-06-18 4 views
1

Предположим, у меня есть алфавит:Генерация динамических списковых в Python

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

Я хотел бы, чтобы генерировать все возможные комбинации длины п (п-меров). Например, для n=2: AA, AT, ..., GG. Чтобы все было интересно, я экспериментировал с тем, чтобы генерировать их со списком в динамическом режиме. Возможно ли это в python? Единственный очевидный путь - использовать eval() и генерировать требуемую строку динамически. Тем не менее, мне было любопытно узнать, был ли менее неуклюжий подход.

ответ

4
>>> from itertools import combinations 
>>> A = ['A', 'T', 'C', 'G'] 
>>> print list(combinations(A,2)) 
[('A', 'T'), ('A', 'C'), ('A', 'G'), ('T', 'C'), ('T', 'G'), ('C', 'G')] 

Или, возможно, (чтобы получить повторы):

>>> from itertools import combinations_with_replacement 
>>> print list(combinations_with_replacement(A,2)) 
[('A', 'A'), ('A', 'T'), ('A', 'C'), ('A', 'G'), ('T', 'T'), ('T', 'C'), ('T', 'G'), ('C', 'C'), ('C', 'G'), ('G', 'G')] 
+0

@JoshLee - Спасибо. Обновлено. :) – mgilson

5

все возможные длины 2, будет - (но вы, вероятно, после permutations, combinations или combinations_with_replacement из itertools .. .)

from itertools import product 

A = ['A', 'T', 'C', 'G'] 
print list(product(A, repeat=2)) 

[('A', 'A'), ('A', 'T'), ('A', 'C'), ('A', 'G'), ('T', 'A'), ('T', 'T'), ('T', 'C'), ('T', 'G'), ('C', 'A'), ('C', 'T'), ('C', 'C'), ('C', 'G'), ('G', 'A'), ('G', 'T'), ('G', 'C'), ('G', 'G')] 

Это эквивалентно [(a,b) for a in A for b in A] но весы легко следует Вы хотите 3, 4, тысячи и т.д. ...

1

Предполагая, что вы не хотите, как 'AT' и 'TA', то itertools.combinations_with_replacement(), вероятно, что вы ищете:

>>> from itertools import combinations_with_replacement 
>>> A = ['A', 'T', 'C', 'G'] 
>>> [''.join(x) for x in combinations_with_replacement(A, 2)] 
['AA', 'AT', 'AC', 'AG', 'TT', 'TC', 'TG', 'CC', 'CG', 'GG']