2016-09-07 2 views
4

Я ищу для вставки постоянного элемента перед каждым из существующего элемента списка, то есть перейти от:Вставка элемента перед каждым элементом списка

['foo', 'bar', 'baz'] 

к:

['a', 'foo', 'a', 'bar', 'a', 'baz'] 

Я попытался с помощью списковых, но лучшее, что я могу достичь, это массив массивов, используя эту инструкцию:

[['a', elt] for elt in stuff] 

Какие RESU lts в этом:

[['a', 'foo'], ['a', 'bar'], ['a', 'baz']] 

Так что не совсем то, что я хочу. Можно ли это сделать, используя понимание списка? На всякий случай это важно, я использую Python 3.5.

ответ

9

Добавить еще один цикл:

[v for elt in stuff for v in ('a', elt)] 

или использовать itertools.chain.from_iterable() вместе с zip() и itertools.repeat(), если вам нужно итератора версию, а не полный список:

from itertools import chain, repeat 
try: 
    # Python 3 version (itertools.izip) 
    from future_builtins import zip 
except ImportError: 
    # No import needed in Python 3 

it = chain.from_iterable(zip(repeat('a'), stuff)) 
+0

Список понимание версия совершенный, спасибо. – Jukurrpa

3

Простой функциональный генератор работает хорошо здесь :

def add_between(iterable, const): 
    # TODO: think of a better name ... :-) 
    for item in iterable: 
     yield const 
     yield item 

list(add_between(['foo', 'bar', 'baz'], 'a') 

Это позволяет избежать вложенного понимания списка и довольно прямолинейно читать и понимать за счет того, что немного более подробный.

1

У вас уже есть

l = [['a', 'foo'], ['a', 'bar], ['a', 'baz']] 

Вы можете выровнять его с помощью

[item for sublist in l for item in sublist] 

это работает даже для произвольной длины вложенного списка.

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

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