Как получить одно определенное число раз в массиве 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)), [])