2017-08-11 19 views
1

この操作を実行できないのはなぜですか?私は以下の2つのリストをネストし、不等サイズのものを持っています。私はセット(ハッシュ可能)にリストを変換してから比較を行う必要があることを学んだが、私はネストされた等しくないリストの比較

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

は、出力を与える、私は方法の下にしようとした(のような共通の要素を取得します) 比較の出力を得ることはありませんset()

または

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

は何に

fin = [i for i in list1 if i in list2] 
print("fin", fin) 
を与えません

fin []

答えて

1

です。問題はネストです。あなたは要素までずっと働かなければなりません。たとえば :

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

出力:

['i2_instance_floating_ip_association'] 
['i1_v1_instance_volume_attach'] 

別のアプローチは、最初の両方のリストを平らにしてセットに変換し、次のようになります。

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

出力:

{'i1_v1_instance_volume_attach', 'i2_instance_floating_ip_association'} 

追加デバッグと何が起こるかを学習するためのいくつかの印刷物:

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) 

出力:

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

私はあなたの方法を使用して出力を取得しています。私は、list2の場合はlist1の中で[for i]のようなトラバースがすべての要素を通過しているはずだと考えました。 –

+0

ループ版にプリントを追加して、実際にどのようなアイテムが表示されているかを確認してください。 –

関連する問題