Как я могу умножить a = ['raj', 'rj', 'reba'] на b = [1,2,2] (целые числа), чтобы получить результат как c = ['raj', 'rj', 'rj', 'reba', 'reba'] - PullRequest
2 голосов
/ 09 апреля 2020

Как я могу умножить

a = ['raj' , 'rj' , 'reba']

на

b = [1,2,2]  # integers

, чтобы получить результат как

c = ['raj' , 'rj' , 'rj' , 'reba' , 'reba']

Моя текущая попытка:

from itertools import chain
a = ['raj', 'rj','reba']
b = [1, 2, 2]
for i in range(len(a)):
   c.extend(list(a[i]*b[i]))

Мой токовый выход:

['r', 'a', 'j', 'r', 'j', 'r', 'j', 'r', 'e', 'b', 'a', 'r', 'e', 'b', 'a']

Ответы [ 4 ]

2 голосов
/ 09 апреля 2020
a = ['raj', 'rj','reba']
b = [1, 2, 2]

c = []
for i,j in zip(a,b):
    c.extend([i]*j)

print(c)

Вывод:

['raj', 'rj', 'rj', 'reba', 'reba']

zip - это встроенная функция python, которая позволяет перебирать несколько списков, используя один для l oop.

list.extend - это функция типа данных list, которая позволяет добавлять элемент в список

1 голос
/ 09 апреля 2020

Существует даже встроенная версия, если вы предпочитаете ее:

sum([[a[k]]*b[k] for k in range(len(a))], [])

Некоторые комментарии:

  • Понимание внутреннего списка создает список списков, каждый из которых содержит количество копий a[k], указанное как b[k]
  • Затем сумма существенно сокращает список списков до плоской версии, объединяя (или добавляя) все списки вместе. Второй аргумент в сумме указывает, откуда он начинается - пустой список (аргумент действительно необходим, так как по умолчанию 0 и список нельзя добавить к целому числу).
1 голос
/ 09 апреля 2020

Это работает:

a = ['Raj', 'Aby']
b = [1,2]
new_list = []
for i in range(len(a)):                # loop till list size
    temp_list = [a[i]] * b[i]          # ['Aby']*2 = ['Aby', 'Aby']
    new_list.extend(temp_list)         # extend() appends temp_list to new_list
print(new_list)                        # Thus ['Raj', 'Aby', 'Aby']

Вы также можете комбинировать temp_list = [a[i]] * b[i] new_list.extend(temp_list) до new_list.extend([a[i]] * b[i] ). Я написал другой способ для большей ясности

1 голос
/ 09 апреля 2020

Вы можете использовать map для этого следующим образом:

import itertools
a = ['raj', 'rj', 'reba']
b = [1, 2, 2]
m = map(lambda x,y:[x]*y, a, b)
lst = list(itertools.chain(*m))
print(lst)

Вывод:

['raj', 'rj', 'rj', 'reba', 'reba']

Обратите внимание, что в этом решении предполагается, что данные всегда верны, т.е. b содержит только int с и len(a) == len(b). map как его help говорит

 |  Make an iterator that computes the function using arguments from
 |  each of the iterables.  Stops when the shortest iterable is exhausted.

В этом случае для каждого элемента a я создаю 1-элемент list, содержащий этот элемент, и умножаю на соответствующее значение b. Затем мне нужно сгладить это (я использую itertools.chain для этого), так как без этого я получу вложенную, а не плоскую структуру.

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