Как получить одно определенное число раз в массиве python
У меня есть один массив вроде A = [1,2,3]
и еще один массив B = [4,5,6]
. Теперь мне нужен еще один массив C, так что элементы в C должны быть теми же элементами B, которые имеют вхождение в порядке элемента A. Как, C = [4, 5, 5, 6, 6, 6]
Ответы
Ответ 1
A = [1,2,3]
B = [4,5,6]
C = [b_item for a_item, b_item in zip(A,B) for _ in range(a_item)]
print C
Результат:
[4, 5, 5, 6, 6, 6]
Это однострочный эквивалент:
C = []
for a_item, b_item in zip(A,B):
for _ in range(a_item):
C.append(b_item)
... Что примерно эквивалентно
C = []
for i in range(min(len(A), len(B))):
a_item = A[i]
b_item = B[i]
for _ in range(a_item):
C.append(b_item)
(NB Не поддавайтесь подстрочным символом подчеркивания Это обычная переменная. Она обычно используется, когда вам действительно не нужно ссылаться на переменную значение, как в этом примере)
Ответ 2
Я предоставлю другой способ сделать это, используя другую идею (не утверждая, что он должен использовать это, но по дидактическим причинам)
Я нахожу довольно аккуратным, чтобы иметь возможность реплицировать элементы в python, используя
[0]*3 # it means we create 3 elements of zero: [0,0,0]
если я просто сделаю это:
[[x]*i for i,x in zip(A, B)]
Я получаю группы элементов:
[[4], [5, 5], [6, 6, 6]]
Затем мы можем использовать itertools.chain, чтобы вернуться в один список:
from itertools import chain
list(chain(*[[x]*i for i,x in zip(A, B)]))
[4, 5, 5, 6, 6, 6]
Ответ 3
Здесь другое решение, использующее numpy:
import numpy
a = numpy.array = [1,2,3]
b = numpy.array = [4,5,6]
c = numpy.repeat(b,a)
Результат:
array([4, 5, 5, 6, 6, 6])
Здесь больше информации об использовании numpy.repeat: http://docs.scipy.org/doc/numpy/reference/generated/numpy.repeat.html
Ответ 4
Мое решение:
C = sum([[B[i]]*A[i] for i in range(len(A))], [])
print C
Explaination:
[B[i]]*A[i]
создаст список с A[i]
элементами B[i]
[B[i]]*A[i] for i in range(len(A))]
предоставит вам список списков, например [[4], [5, 5], [6, 6, 6]]
sum(C, [])
преобразует список списков в список
Ответ 5
Другой способ:
C = []
for a, b in zip(A, B):
C.extend([b] * a)
Но я бы предпочел понимание списка, просто без раздражающего _item
, i.e.,
C = [b for a, b in zip(A, B) for _ in range(a)]
Или более короткий (но для больших случаев медленный) sum:
C = sum(([b] * a for a, b in zip(A, B)), [])