Создание списка с использованием списка частот в Python

1
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]

Как создать новый список, который добавляет элементы из одного списка в несколько раз в зависимости от другого списка?

Спасибо

  • 0
    Под «числом раз, зависящим от другого списка», что именно вы имеете в виду? Количество предметов или их значения или?
Теги:
python-3.x

7 ответов

4

Используйте понимание списка:

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]
  • 0
    Спасибо, но это не совсем верно, это приводит к output_age = [[19, 19], [20], [21], [22, 22, 22], [23, 23], [24], [25] ]]
  • 0
    @ jr100 еще раз, я исправил
3

Вот решение, использующее 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]
3

Использование 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 чтобы сгладить список.
2

Самый простой и простой способ понять;

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)
1

Вы также можете сделать это, используя функцию 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]
0

Тебе нужно:

import functools
output_age = functools.reduce(lambda x, y:x+y, [[age[i]] * frequency[i] for i in range(len(age))])
0
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]

Ещё вопросы

Сообщество Overcoder
Наверх
Меню