我正在尝试将两个字符串列表合并为一个,其中第一个字符串列表应用于列表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']]
答案 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']]