age = [19, 20, 21, 22, 23, 24, 25]
frequency = [2, 1, 1, 3, 2, 1, 1]
output_age = [19, 19, 20, 21, 22, 22, 22, 23, 23, 24, 25]
Как создать новый список, который добавляет элементы из одного списка в несколько раз в зависимости от другого списка?
Спасибо
Используйте понимание списка:
output_age = [i for l in ([a]*f for a, f in zip(age, frequency)) for i in l]
#[19, 19, 20, 21, 22, 22, 22, 23, 23, 24, 25]
Зачем?
Мы первые zip
вместе age
и frequency
списки, чтобы мы могли перебирать их в унисон. Таким образом:
for a, f in zip(age, frequency):
print(a, f)
дает:
19 2
20 1
21 1
22 3
23 2
24 1
25 1
Затем мы хотим повторить каждый элемент a
, столько раз, сколько f
определяет. Это можно сделать, создав список и умножив его. Как:
[4] * 3
#[4, 4, 4]
Затем нам нужно распаковать эти значения, чтобы мы обернули это выражение в генераторе (обозначенное скобками) и перейдем к нему. Это выравнивает список. Обратите внимание, что есть альтернативные способы достижения этого (например, использование itertools.chain.from_iterable
).
Альтернативным методом было бы повторить число, a
, путем итерации над объектом range
а не умножения списка для получения повторений.
Этот метод будет выглядеть примерно так:
output_age = [a for a, f in zip(age, frequency) for _ in range(f)]
#[19, 19, 20, 21, 22, 22, 22, 23, 23, 24, 25]
Вот решение, использующее zip
и range
>>> age = [19, 20, 21, 22, 23, 24, 25]
>>> frequency = [2, 1, 1, 3, 2, 1, 1]
>>> [a for a,f in zip(age, frequency) for _ in range(f)]
[19, 19, 20, 21, 22, 22, 22, 23, 23, 24, 25]
Использование itertools
и zip
Пример:
from itertools import chain
age = [19, 20, 21, 22, 23, 24, 25]
frequency = [2, 1, 1, 3, 2, 1, 1]
print( list(chain.from_iterable([[i] * v for i,v in zip(age, frequency)])) )
Выход:
[19, 19, 20, 21, 22, 22, 22, 23, 23, 24, 25]
chain.from_iterable
чтобы сгладить список.Самый простой и простой способ понять;
age = [19, 20, 21, 22, 23, 24, 25]
frequency = [2, 1, 1, 3, 2, 1, 1]
output_age = []
for age, freq in zip(age, frequency):
for _ in range(freq):
output_age.append(age)
Вы также можете сделать это, используя функцию sum
, хотя это не рекомендуется для производственного кода:
age = [19, 20, 21, 22, 23, 24, 25]
frequency = [2, 1, 1, 3, 2, 1, 1]
output_age = sum([[age[i]] * frequency[i] for i in range(len(age))],[])
print(output_age)
Выход:
[19, 19, 20, 21, 22, 22, 22, 23, 23, 24, 25]
Тебе нужно:
import functools
output_age = functools.reduce(lambda x, y:x+y, [[age[i]] * frequency[i] for i in range(len(age))])
age = [19, 20, 21, 22, 23, 24, 25]
frequency = [2, 1, 1, 3, 2, 1, 1]
new_list = zip(age, frequency)
output_age=[]
for x,y in new_list:
for i in range(y):
output_age.append(x)
выход:
[19, 19, 20, 21, 22, 22, 22, 23, 23, 24, 25]