Список с дублированными значениями и суффиксом

У меня есть список, a:

a = ['a','b','c']

и нужно дублировать некоторые значения с суффиксом _ind добавлено так (порядок важен):

['a', 'a_ind', 'b', 'b_ind', 'c', 'c_ind']

Я старался:

b = [[x, x + '_ind'] for x in a]
c = [item for sublist in b for item in sublist]
print (c)
['a', 'a_ind', 'b', 'b_ind', 'c', 'c_ind']

Я думаю, что мое решение немного сложнее. Есть ли лучшее, более питонное решение?

6 ответов

Решение

Вы можете сделать это генератором:

def mygen(lst):
    for item in lst:
        yield item
        yield item + '_ind'

>>> a = ['a','b','c']
>>> list(mygen(a))
['a', 'a_ind', 'b', 'b_ind', 'c', 'c_ind']

Вы также можете сделать это с itertools.product, itertools.starmap или же itertools.chain или вложенные понимания, но в большинстве случаев я бы предпочел простую для понимания пользовательскую функцию генератора.


С python3.3 вы также можете использовать yield from—Генерация делегирования — чтобы сделать это элегантное решение чуть более кратким:

def mygen(lst):
    for item in lst:
        yield from (item, item + '_ind')

Его можно немного сократить, переместив параметры во внутренний цикл for в понимании списка:

a = ['a','b','c']

[item for x in a for item in (x, x + '_ind')]
# ['a', 'a_ind', 'b', 'b_ind', 'c', 'c_ind']

Другая альтернатива сращиванием (Python2.x, 3.x):

In [642]: result = [None] * len(a) * 2

In [643]: result[::2], result[1::2] = a, map(lambda x: x + '_ind', a)

In [644]: result
Out[644]: ['a', 'a_ind', 'b', 'b_ind', 'c', 'c_ind']

Ты можешь использовать itertools.chain():

import itertools

l = ['a','b','c']

new_list = list(itertools.chain.from_iterable([[i, i+"_ind"] for i in l]))

print new_list

Выход:

['a', 'a_ind', 'b', 'b_ind', 'c', 'c_ind']

До того, как составление списков и генераторы были изобретены / получили широкое распространение, люди привыкли думать намного проще1:

>>> a = ['a', 'b', 'c']
>>> b = []
>>> for x in a: b.extend([x, x+'_ind'])
... 
>>> b
['a', 'a_ind', 'b', 'b_ind', 'c', 'c_ind']

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

Так как вы попросили "простой", я решил добавить это (хотя, может быть, не pythonic путь):

for i in mylist: 
    mylist1.append(i);
    mylist1.append(i + '_ind');
Другие вопросы по тегам