Как я могу скопировать каждый элемент списка в определенное количество раз? - PullRequest
0 голосов
/ 01 апреля 2019

Я использую Python 3, и я хочу создать новый список с элементами из первого списка, повторенными столько раз, сколько соответствует номеру второго списка

Например:

char = ['a', 'b', 'c']
int = [2, 4, 3]
result = ['a', 'a', 'b', 'b', 'b', 'b', 'c', 'c', 'c']

Спасибо за помощь

Ответы [ 6 ]

5 голосов
/ 01 апреля 2019

Однострочное решение

Итерация по обоим спискам одновременно с zip и создание подсписков для каждого элемента правильной длины.Присоединитесь к ним с помощью itertools.chain:

# from itertools import chain
list(chain(*([l]*n for l, n in zip(char, int))))

Вывод:

['a', 'a', 'b', 'b', 'b', 'b', 'c', 'c', 'c']
1 голос
/ 01 апреля 2019
char = ['a', 'b', 'c']
ints = [2, 4, 3]

Решение 1: Использование numpy

import numpy as np
result = np.repeat(char, ints)

Решение 2: Чистый питон

result = []
for i, c in zip(ints, char):
    result.extend(c*i)

Вывод:

['a', 'a', 'b', 'b', 'b', 'b', 'c', 'c', 'c']
0 голосов
/ 01 апреля 2019

Один вкладыш с использованием списка-понимания и sum(list_, []).

sum([[x]*y for x,y in zip(char_, int_)], [])


>>> char_ = ['a', 'b', 'c']
>>> int_ = [2, 4, 3]
>>> print(sum([[x]*y for x,y in zip(char_, int_)], []))
>>> ['a', 'a', 'b', 'b', 'b', 'b', 'c', 'c', 'c']

Альтернатива:

list(itertools.chain.from_iterable([[x]*y for x,y in zip(char_, int_)]))

Похоже, это быстрее, чем с помощью itertools.

>>> timeit.repeat(lambda:list(itertools.chain.from_iterable([[x]*y for x,y in zip(char_, int_)])), number = 1000000)
[1.2130177360377274, 1.115080286981538, 1.1174913379945792]

>>> timeit.repeat(lambda:sum([[x]*y for x,y in zip(char_, int_)], []), number = 1000000)
[1.0470570910256356, 0.9831087450147606, 0.9912429330288433]
0 голосов
/ 01 апреля 2019
char = ['a', 'b', 'c']
rep = [2, 4, 3]

res = [c*i.split(",") for i,c in zip(char, rep )]      # [['a', 'a'], ['b', 'b', 'b', 'b'], ['c', 'c', 'c']]
print([item for sublist in res for item in sublist])   # flattening the list

РЕДАКТИРОВАТЬ :

однострочное использование itertools.chain:

print(list(chain(*[c*i.split(",") for (i,c) in zip(char, int)])))

ВЫХОД :

['a', 'a', 'b', 'b', 'b', 'b', 'c', 'c', 'c']
0 голосов
/ 01 апреля 2019

С для петель, очень простой:

results = list()
for k, i in enumerate(integers):
    results_to_add = char[k]*i
    results.extend(results_to_add)
0 голосов
/ 01 апреля 2019

Использование zip

Ex:

c = ['a', 'b', 'c']
intVal = [2, 4, 3]

result = []
for i, v in zip(c, intVal):
    result.extend(list(i*v))
print(result)

Выход:

['a', 'a', 'b', 'b', 'b', 'b', 'c', 'c', 'c']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...