2017-07-20 1 views
2

J'essaie de combiner deux listes de chaînes en une, où la première liste de chaînes est appliquée à tous les éléments de la liste 2. Les listes sont toujours de la même longueur, mais la liste de sous-liste Peut contenir plus d'une liste.Combiner la liste avec la sous-liste de taille différente

J'ai essayé en utilisant la combinaison zip(), comme ceci:

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

Mais cela ne fonctionne pas lorsque la sous-liste ne correspond pas à la longueur.

Voici un exemple de ce que je veux faire:

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

Et la sortie doit être:

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

Est-il seulement emboîtés un niveau Profond? –

+0

oui, seulement imbriqué un niveau de profondeur. –

+2

Pourquoi 'item1' ne figure-t-il pas également dans sa propre liste? – poke

Répondre

4

Vous pouvez utiliser l'approche suivante:

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

Cette génère:

>>> ['%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']] 

Le code fonctionne comme suit: nous utilisons - comme vous l'avez fait vous-même - zip(list1,list2) pour produire des paires d'éléments des deux listes. Maintenant, pour chaque paire, nous évaluons l'opérateur ternaire tel qu'il est écrit dans la première ligne.

L'opérateur ternaire va d'abord inspecter si isinstance(y,str) est en attente (nous vérifions si y est une chaîne). Si oui, nous ajoutons simplement %s_%s%(x,y) à la liste. Sinon, nous évaluons une compréhension de la liste ['%s_%s'%(x,yi) for yi in y]. Ici, nous parcourons chaque élément yi de y, et nous ajoutons ensuite %s_%s%(x,yi) à la sous-liste.

3

Vous pouvez le approch suivant, où vous vérifiez si l'élément de list2 est une liste ou non:

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

Ce qui donne le résultat attendu:

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

Lol, nous sommes arrivés avec presque la même solution simultanément :) –

+0

course à la milliseconde :) – FLab