2016-12-15 4 views
0

Я хотел бы сделать что-то вроде этого:длина Изменить список с пониманием

Input: [3, 4, 1, 2] 
Output: ["3", "", "", "4", "", "", "1", "", "", "2", "", ""] 

Я знаю, что

x = [3, 4, 1, 2] 
[str(i) for i in x] 

будет производить список без лишних пустых строк. Мой вопрос заключается в том, есть ли простой способ сделать Python вперед и создать 3 элемента вывода для каждого элемента ввода в понимании. Если нет, то я могу, конечно, написать цикл ...

+7

Где '1' в вашей выборке вывод? –

+0

Вы уверены, что список - это то, что вы хотите? Если вы хотите связать некоторые строки с каждым числом, вам может быть лучше использовать что-то вроде dict. – danielunderwood

+0

Список чисел - это абстракция того, что мне действительно нужно; мой вопрос действительно о том, как создать такой список. – John

ответ

5

Двойной цикл в список постижение актов как map + chain, которые вы можете использовать:

[j for i in x for j in [str(i), "", ""]] 
# ['3', '', '', '4', '', '', '1', '', '', '2', '', ''] 

с map и chain синтаксиса, вы можете сделать:

from itertools import chain 
list(chain.from_iterable([str(i), "", ""] for i in x)) 
# ['3', '', '', '4', '', '', '1', '', '', '2', '', ''] 
+0

Просто то, что мне было нужно, и подход к карте/цепочке обращается ко мне с Schemer. :) – John

+0

@Psidom: не могли бы вы объяснить, как работает ваш первый фрагмент кода. Он выглядит великолепно элегантно. – trinkner

+0

@trinkner Это замкнутый цикл. Сначала проведите через вектор x и для каждого элемента x создайте новый список '[str (i)," "," "]', как требуется OP, и j будет проходить через этот новый список и помещать каждый элемент в список результатов. Это действует как карта + сгладить. – Psidom

0

Вы можете использовать список понимание, но производят три-строковые блоки, а затем объединить их:

sum([[str(i), "", ""] for i in x], []) 
# ['3', '', '', '4', '', '', '1', '', '', '2', '', ''] 
1

Вы также можете достичь этого с помощью zip с списка понимание как:

>>> my_list = [3, 4, 1, 2] 
>>> empty_list = [""] * len(my_list) 

>>> [i for z in zip(my_list, empty_list, empty_list) for i in z] 
[3, '', '', 4, '', '', 1, '', '', 2, '', ''] 

ИЛИ используя itertools.chain вместе с zip как:

>>> from itertools import chain 

>>> list(chain(*zip(my_list, empty_list, empty_list))) 
[3, '', '', 4, '', '', 1, '', '', 2, '', '']