修真

2016-12-15 24 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, '', '']