2017-08-11 2 views
1

Pourquoi suis-je incapable d'effectuer cette opération? J'ai ci-dessous 2 listes, imbriquées et de taille inégale. J'ai appris que je dois convertir des listes de jeux (HASHABLE), puis effectuer la comparaison, mais je ne comprends pas la sortie de la comparaison (comme obtenir l'élément commun) J'ai essayé ci-dessous les méthodesComparaison de listes inégales imbriquées

list1 = [[u'i2_instance_floating_ip_association'], [u'i1_v1_instance_volume_attach']] 
list2 = [[u'i2_instance_floating_ip_association', u'i2_v1_instance_volume_attach'], [u'i1_instance_floating_ip_association', u'i1_v1_instance_volume_attach']] 
list1 = map(tuple, list1) 
list2 = map(tuple, list2) 
print(set(list1) & set(list2)) 

donne une sortie set()

ou

for item in list1: 
    if item in list2: 
     print(item) 

ne donne rien

fin = [i for i in list1 if i in list2] 
print("fin", fin) 

donne fin []

Répondre

1

Le problème est l'imbrication. Vous devez travailler jusqu'aux éléments. Par exemple:

for item in list1: 
    for list2_item in list2: 
     if item[0] in list2_item: 
      print(item) 

Sortie:

['i2_instance_floating_ip_association'] 
['i1_v1_instance_volume_attach'] 

Une autre approche serait aplatissent les deux listes d'abord et de les convertir en ensembles:

flat1 = set(x[0] for x in list1) 
flat2 = set(y for x in list2 for y in x) 
print(flat1 & flat2) 

Sortie:

{'i1_v1_instance_volume_attach', 'i2_instance_floating_ip_association'} 

Ajouter quelques impressions pour le débogage et l'apprentissage ce qui se passe:

for item in list1: 
    print('item', item) 
    for list2_item in list2: 
     print('list2_item', list2_item) 
     if item[0] in list2_item: 
      print(' found', item[0], 'in', list2_item) 
     else: 
      print(' did not find', item[0], 'in', list2_item) 

Sortie:

item ['i2_instance_floating_ip_association'] 
list2_item ['i2_instance_floating_ip_association', 'i2_v1_instance_volume_attach'] 
    found i2_instance_floating_ip_association in ['i2_instance_floating_ip_association', 'i2_v1_instance_volume_attach'] 
list2_item ['i1_instance_floating_ip_association', 'i1_v1_instance_volume_attach'] 
    did not find i2_instance_floating_ip_association in ['i1_instance_floating_ip_association', 'i1_v1_instance_volume_attach'] 
item ['i1_v1_instance_volume_attach'] 
list2_item ['i2_instance_floating_ip_association', 'i2_v1_instance_volume_attach'] 
    did not find i1_v1_instance_volume_attach in ['i2_instance_floating_ip_association', 'i2_v1_instance_volume_attach'] 
list2_item ['i1_instance_floating_ip_association', 'i1_v1_instance_volume_attach'] 
    found i1_v1_instance_volume_attach in ['i1_instance_floating_ip_association', 'i1_v1_instance_volume_attach'] 
+0

Je reçois la sortie en utilisant votre méthode. Je pensais que traverser comme [i for i dans list1 si je dans list2] aurait dû traverser tous les éléments. –

+0

Juste ajouter quelques impressions à la version de boucle pour voir ce que les éléments que vous avez réellement ressemblent. –