修真

2016-12-15 23 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

你確定列表是你想要的嗎?如果你想把一些字符串與每個數字聯繫起來,你最好使用類似於字典的東西。 – danielunderwood

+0

數字列表是我真正需要的東西的抽象;我的問題實際上是關於如何製作這樣的清單。 – John

回答

5

雙人間在列表理解行爲環路像map + chain,你可以使用:

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

隨着mapchain語法,你可以這樣做:

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這是一個嵌套for循環。首先遍歷向量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, '', '']