2017-02-14 1 views
2

У меня есть список ['A', 'B', 'C', 'D'] и [1, 2, 3, 4], оба списка всегда будут иметь одинаковое количество элементов. Мне нужно умножить каждую строку на ее номер, поэтому конечный продукт, который я ищу, - это:умножая список строк на список int, элемент за элементом

['A', 'B', 'B', 'C', 'C', 'C', ' D ',' D ',' D ',' D '].

Любая помощь будет оценена, спасибо.

ответ

1

Вложенного список постижения тоже работает:

>>> l1 = ['A', 'B', 'C', 'D'] 
>>> l2 = [1, 2, 3, 4] 
>>> [c for c, i in zip(l1, l2) for _ in range(i)] 
['A', 'B', 'B', 'C', 'C', 'C', 'D', 'D', 'D', 'D'] 

В выше zip возвращает (char, count) кортежей:

>>> t = list(zip(l1, l2)) 
>>> t 
[('A', 1), ('B', 2), ('C', 3), ('D', 4)] 

Тогда для каждого кортежа второй for цикла выполняется count раз, чтобы добавить символ к результату:

>>> [char for char, count in t for _ in range(count)] 
['A', 'B', 'B', 'C', 'C', 'C', 'D', 'D', 'D', 'D'] 
1

Я хотел бы использовать itertools.repeat для хорошей, эффективной реализации:

>>> letters = ['A', 'B', 'C', 'D'] 
>>> numbers = [1, 2, 3, 4] 
>>> import itertools 
>>> result = [] 
>>> for letter, number in zip(letters, numbers): 
...  result.extend(itertools.repeat(letter, number)) 
... 
>>> result 
['A', 'B', 'B', 'C', 'C', 'C', 'D', 'D', 'D', 'D'] 
>>> 

Я также думаю, что это вполне читаема.

0

код довольно прямо вперед, увидеть встроенные комментарии

l1 = ['A', 'B', 'C', 'D'] 
l2 = [1, 2, 3, 4] 
res = [] 
for i, x in enumerate(l1): # by enumerating you get both the item and its index 
    res += x * l2[i] # add the next item to the result list 
print res 

ВЫВОД

['A', 'B', 'B', 'C', 'C', 'C', 'D', 'D', 'D', 'D'] 
0

Вы используете zip(), чтобы сделать это, как таким образом:

a = ['A', 'B', 'C', 'D'] 
b = [1, 2, 3, 4] 

final = [] 
for k,v in zip(a,b): 
    final += [k for _ in range(v)] 

print(final) 

Выход:

>>> ['A', 'B', 'B', 'C', 'C', 'C', 'D', 'D', 'D', 'D'] 

Или вы можете сделать это, тоже, используя zip() и list comprehension:

a = ['A', 'B', 'C', 'D'] 
b = [1, 2, 3, 4] 
final = [k for k,v in zip(a,b) for _ in range(v)] 
print(final) 

Выход:

>>> ['A', 'B', 'B', 'C', 'C', 'C', 'D', 'D', 'D', 'D'] 
Смежные вопросы