Будучи новичком в Python, вот моя проблема. Дано два списка:

a = [3, 4] 
b = [5, 2]

Я хочу создать новый список, который состоит из элементов первого списка, повторенных n раз, где n - соответствующий элемент во втором списке. Поэтому я хотел бы вывод, как:

c = [3,3,3,3,3,4,4]

Где 3 повторяется 5 раз, 4 повторяется 2 раза и так далее. Мой текущий код выглядит так

for item,no in zip(a,b):
    print(str(item)*no)

Что меня достает:

33333
44

Я пытаюсь понять, как перейти от моей текущей стадии к желаемому результату. Любая помощь будет оценена.

Я также думал, что, возможно, это можно сделать с помощью понимания списка, но я не смог придумать для этого код на python.

2
Ayush Joshi 13 Дек 2016 в 19:49

7 ответов

Лучший ответ

Вы можете использовать понимание списка следующим образом:

[i for i,j in zip(a, b) for k in range(j)]

Вышеуказанная строка эквивалентна следующему вложенному циклу:

c = []
for i,j in zip(a, b):
    for k in range(j):
        c.append(i)

< Сильный > Вывод :

>>> a = [3, 4]
>>> b = [5, 2]
>>> c = [i for i,j in zip(a, b) for k in range(j)]
>>> c
[3, 3, 3, 3, 3, 4, 4]
0
ettanany 13 Дек 2016 в 17:00
c=[]
for item, count in zip(a,b):
    c.extend([item]*count)
print(c)

Должен сделать это. Добавляйте в список по одному элементу за раз, а затем печатайте все сразу в конце. [item]*count - это count - список элементов ([]) из item и extend добавляет содержимое списка, который вы предоставляете, в список, для которого вы вызываете extend.

0
cxw 13 Дек 2016 в 16:51

Простое понимание списка будет работать:

>>> a = [3, 4]
>>> b = [5, 2]
>>> [c for n, m in zip(a, b) for c in [n]*m]
[3, 3, 3, 3, 3, 4, 4]

Если вы обеспокоены эффективностью памяти (например, для большого m), то вы можете использовать itertools.repeat(), чтобы избежать промежуточных списков:

>>> import itertools as it
>>> [c for n, m in zip(a, b) for c in it.repeat(n, m)]
[3, 3, 3, 3, 3, 4, 4]
2
AChampion 13 Дек 2016 в 16:59

Вы сказали, что вы новичок в Python, поэтому вот простой способ сделать это, просто используя базовые циклы:

a = [3 , 4]
b = [5 , 2]
c = []
index = 0
for i in a:
     for i in range(0 , b[index]):
         c.append(i)
     index += 1
0
noɥʇʎԀʎzɐɹƆ 13 Дек 2016 в 18:03

Вам просто нужно использовать расширение

c = []
for item, no in zip(a, b):
    c.extend([item] * no)
0
Shaun 13 Дек 2016 в 16:52
c = []
for i in range(len(b)):
    for j in range(b[i]):
        c.append(a[i])
print c
0
Miles Gehm 13 Дек 2016 в 17:49

Что-то немного другое

c = [a[b.index(j)] for i,j in enumerate(b) for i in range(j)]
0
hfz 13 Дек 2016 в 17:55