将列表与不同大小的子列表组合在一起

时间:2017-07-20 13:21:19

标签: python string list list-comprehension

我正在尝试将两个字符串列表合并为一个,其中第一个字符串列表应用于列表2的所有项目。列表总是相同的长度,但列表2的子列表可以包含多个列表。

我尝试使用zip()进行组合,如下所示:

[str(x)+'_'+str(y) for x,y in zip(list1,list2)]

但是当子列表的长度不匹配时,这不起作用。

以下是我想要做的一个例子:

list1 = ['H1','H2','H3','H4']
list2 = ['item1',['item2','item3'],['item4','item5','item6'],['item7','item8']]

输出应为:

list = ['H1_item1',['H2_item2','H2_item3'],['H3_item4','H3_item5','H3_item6'],['H4_item7','H4_item8']]

2 个答案:

答案 0 :(得分:4)

您可以使用以下方法:

['%s_%s'%(x,y) if isinstance(y,str) else ['%s_%s'%(x,yi) for yi in y]
     for x,y in zip(list1,list2)]

这会产生:

>>> ['%s_%s'%(x,y) if isinstance(y,str) else ['%s_%s'%(x,yi) for yi in y]
...      for x,y in zip(list1,list2)]
['H1_item1', ['H2_item2', 'H2_item3'], ['H3_item4', 'H3_item5', 'H3_item6'], ['H4_item7', 'H4_item8']]

代码的工作原理如下:我们使用 - 就像你自己做的那样 - zip(list1,list2)来生成两个列表中的元素对。现在对于每个这样的对,我们评估第一行中写的三元运算符

三元运算符将首先检查isinstance(y,str)是否成立(我们检查y是否为字符串)。如果是这样,我们只需将%s_%s%(x,y)添加到列表中。如果没有,我们会评估列表理解['%s_%s'%(x,yi) for yi in y]。在这里,我们迭代 yi的每个元素y,然后我们将%s_%s%(x,yi)添加到子列表中。

答案 1 :(得分:3)

您可以尝试使用以下approch,检查list2中的元素是否为列表:

[[str(x)+'_'+str(el) for el in y] if isinstance(y, list)
 else str(x)+"_"+str(y) for x,y in zip(list1,list2)]

这给出了预期的输出:

['H1_item1',
 ['H2_item2', 'H2_item3'],
 ['H3_item4', 'H3_item5', 'H3_item6'],
 ['H4_item7', 'H4_item8']]