2017-07-20 81 views
2

我想將兩個字符串列表合併爲一個,其中第一個字符串列表應用於列表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']] 
+1

難道僅僅是一個嵌套層次深? –

+0

是的,只嵌套一層深度。 –

+2

爲什麼'item1'不在自己的列表中? – poke

回答

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]。在這裏,我們重複元素yiy,然後我們將%s_%s%(x,yi)添加到子列表。

3

你可以試試下面的計算策略,在您檢查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']] 
+0

大聲笑,我們想出了幾乎相同的解決方案:) –

+0

比賽到毫秒:) – FLab