Список с дублирующимися значениями и суффикс
У меня есть список, 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']
Я думаю, что мое решение немного сложнее. Есть ли еще лучшее, более питоническое решение?
Ответы
Ответ 1
Вы можете сделать это генератором:
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
или вложенных понятий, но в большинстве случаев я бы предпочел просто понять пользовательскую генератор-функцию.
Ответ 2
Его можно немного сократить, переместив параметры во внутренний цикл в понимании списка:
a = ['a','b','c']
[item for x in a for item in (x, x + '_ind')]
# ['a', 'a_ind', 'b', 'b_ind', 'c', 'c_ind']
Ответ 3
Другая альтернатива с сращиванием (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']
Ответ 4
Вы можете использовать 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']
Ответ 5
Прежде чем придумать/распространить переписные слова и генераторы, люди привыкли думать гораздо проще 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']
* Я не имею в виду, что эти конструкции/инструменты являются злыми, просто хотел указать, что есть простое решение.
Ответ 6
Поскольку вы просили "простую", я, хотя id, бросаю это в (хотя, может быть, не в стиле pythonic
)
for i in mylist:
mylist1.append(i);
mylist1.append(i + '_ind');