2016-06-02 2 views
1

Учитывая следующие списки:Python Повторных элементов в одном списке на основе элементов из другого

a = [0, 5, 1] 
b = [1, 2, 1] 

Я хотел бы повторить каждый элемент [а] по количеству соответствующей позиции в [б], чтобы это:

[0, 5, 5, 1] 

ie 0 возникает 1 раз, 5 происходит 2 раза, а 1 встречается 1 раз.

+2

Похоже, вы хотите, чтобы мы написали вам код. Хотя многие пользователи готовы создавать код для кодера, терпящего бедствие, они обычно помогают только тогда, когда плакат уже попытался решить проблему самостоятельно. Хорошим способом продемонстрировать это усилие является включение кода, который вы написали до сих пор, пример ввода (если он есть), ожидаемый вывод и вывод, который вы фактически получаете (вывод консоли, трассировки стека, ошибки компилятора - все, что угодно применимо). Чем больше деталей вы предоставляете, тем больше ответов вы получите. –

+1

Какая невероятная поездка. Во-первых, меня избивали в новообращенную подачу за то, что вы не отправили лучшую должность (должным образом отметили), а затем набросились большие ответы. –

ответ

1
In [7]: a = [0, 5, 1] 

In [8]: b = [1, 2, 1] 

In [9]: list(itertools.chain(*(itertools.repeat(elem, n) for elem, n in zip(a, b)))) 
Out[9]: [0, 5, 5, 1] 

In [10]: b = [2, 3, 4] 

In [11]: list(itertools.chain(*(itertools.repeat(elem, n) for elem, n in zip(a, b)))) 
Out[11]: [0, 0, 5, 5, 5, 1, 1, 1, 1] 

Кусков здесь являются следующим:

  • itertools.repeat(elem, n) - повтор эль п раз
  • zip(a, b) Составьте список из 2-х кортежей из двух списков, сопрягая каждый элемент с соответствующим элементом в другом списке. Это дает вам именно то, что вам нужно передать в itertools.repeat в вашем прецеденте.
  • itertools.chain - выравнивает результирующий список итераторов в один список значений. Вы можете либо chain(*iterable), как я сделал, либо chain.from_iterable(iterable), как и Martijn Peters.
4

Используйте zip() function с itertools.repeat() и itertools.chain.from_iterable():

try: 
    # use iterator zip on Python 2 too 
    from future_builtins import zip 
except ImportError: 
    pass 
from itertools import repeat, chain 

list(chain.from_iterable(repeat(value, count) for value, count in zip(a, b))) 

(я добавил Python 2 forward-compatible import для тех, кто не может переключиться на Python 3 все же).

Демо:

>>> from itertools import repeat, chain 
>>> a = [0, 5, 1] 
>>> b = [1, 2, 1] 
>>> list(chain.from_iterable(repeat(value, count) for value, count in zip(a, b))) 
[0, 5, 5, 1] 

Альтернативный подход был бы использовать список понимание; это медленнее, повторяющиеся элементы выполняются в байткоде вместо C:

[value for value, count in zip(a, b) for _ in range(count)] 
+0

Ничего себе, великие умы ... xD –

+0

@ Two-BitAlchemist: hehe; Я нахожусь в поезде, и я боялся, что опоздаю, потому что я ждал, когда вернется связь! –

+0

Я поддержал это, потому что вы обнаружили ошибку в моем коде –

 Смежные вопросы

  • Нет связанных вопросов^_^