Лучший способ умножения строки на массив

#python #string #list

#python #строка #Список

Вопрос:

Я хочу повторить каждый символ в моей строке на число, которое у меня есть в массиве, т. Е. если

 rep = [1, 0, 1, 1, 3, 0, 0, 1, 0]
seq = 'AATCGGGAA'
  

Я хочу что-то вроде

 seq*rep
  

для вывода

 ATCGGGA
  

Ответ №1:

Вы можете использовать zip , понимание списка и str.join :

 >>> rep = [1, 0, 1, 1, 3, 0, 0, 1, 0]
>>> seq = 'AATCGGGAA'
>>>
>>> list(zip(seq, rep)) # zip pairs up the items in the two lists
[('A', 1), ('A', 0), ('T', 1), ('C', 1), ('G', 3), ('G', 0), ('G', 0), ('A', 1), ('A', 0)]
>>>
>>> ''.join([x*y for x,y in zip(seq, rep)])
'ATCGGGA'
>>>
  

Ответ №2:

Самым быстрым способом сделать это будет использование map с operator.mul :

 >>> from operator import mul
>>> ''.join(map(mul, seq, rep))
'ATCGGGA'
  

Комментарии:

1. Что вы подразумеваете под самым быстрым, то есть наиболее эффективным? наименьшее количество нажатий клавиш?

2. Хорошая находка! Я ценю разнообразие ответов, которые можно получить от SO

3. Итак, какой из них выигрывает, если вы пользователь itertools.izip() (или просто обычный zip в python 3)?

Ответ №3:

Это должно сработать:

 "".join([s*r for r, s in zip(rep, seq)])
  

Вывод:

 "ATCGGGA"
  

Комментарии:

1. @iCodez опередил вас в этом 🙂 хотя спасибо за ответ