Heenashree Khandelwal
Heenashree Khandelwal

Reputation: 689

Nested unequal lists comparison

Why am I unable to perform this operation? I have below 2 lists, nested and of unequal size. I learned that I need to convert lists to sets (hashable) and then perform comparison, but I don't get the output of the comparison (like get the common element) I tried below methods

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))

gives output set()

or

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

gives nothing

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

gives fin []

Upvotes: 1

Views: 68

Answers (1)

Mike Müller
Mike Müller

Reputation: 85522

The problem is the nesting. You have to work all the way down to the elements. For example:

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

Output:

['i2_instance_floating_ip_association']
['i1_v1_instance_volume_attach']

Another approach would be flatten both lists first and convert them into sets:

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

Output:

{'i1_v1_instance_volume_attach', 'i2_instance_floating_ip_association'}

Add some prints for debugging and learning what happens:

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)

Output:

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

Upvotes: 1

Related Questions