2016-09-13 6 views
1

でリスト要素の交点を、取得:例えば、リストの要素が含まれています、私は二つのリストを持っている別のサブリストのデータ型

list1 = [['placeholder1', {'data': 'data1'}], ['placeholder2', {'data': 'data2'}], ['placeholder2', {'data': 'data1'}]] 
list2 = [['placeholder2', {'data': 'data2'}], ['placeholder3', {'data': 'data5'}]] 

intersection_result = [['placeholder2', {'data': 'data2'}]] 

サブリストの要素の構造は一例です。すべてのサブリスト要素に文字列['asdf', 'qwert']が含まれているか、文字列と数字が混在している可能性もあります(['sdfs', 232])。ただし、サブリスト構造は常に(両方のリストで)同じです。

両方のリストで同じリスト要素の共通部分を取得するにはどうすればよいですか?

答えて

3

私の理解が正しい場合は、小さい方のリストの要素のうち大きい方の要素に等しいもののうち、any()をチェックして選択することで交差点を得ることができます。

理解では、これは次のようになります。

intersection_res = [l for l in min(list2, list1, key=len) if any(l == l2 for l2 in max(list1, list2, key=len))] 

これは、常に小さなリストから選択し、大きい方に対してチェックするlenに割り当てられたキーを持つminmaxを使用しています。

この利回り:

print(intersection_res) 
[['placeholder2', {'data': 'data2'}]] 

この理解は、あなたが最小 - 最大のリストを事前に割り当てるとダウントリミングや、もちろん、あなたが常に一定であれば、他のよりも大きいリストすることができます。

sm, la = list1, list2 if len(list1) < len(list2) else list2, list1 
intersection_res = [l for l in sm if any(l == l2 for l2 in la)] 
1

簡単な解決方法は、のデータ構造とは独立したとなります。 データに対してsignature hashes(jsonまたはpformatを使用)を生成し、list1とlist2の両方で共通のハッシュを見つけることができます。

デモhttp://ideone.com/5i9cs8

import json 

list1 = [['placeholder1', {'data': 'data1'}], ['placeholder2', {'data': 'data2'}], ['placeholder2', {'data': 'data1'}]] 
list2 = [['placeholder2', {'data': 'data2'}], ['placeholder3', {'data': 'data5'}]] 
sig1 = { hash(json.dumps(x, sort_keys=True)):x for x in list1 } 
sig2 = { hash(json.dumps(x, sort_keys=True)):x for x in list2 } 
result = {x:sig1[x] for x in sig1 if x in sig2} 
print(result) 
#prints {-7754841686355067234: ['placeholder2', {'data': 'data2'}]} 
  • あなたの辞書には、例えば、JSONのシリアル化をサポートしていないデータがある場合datetime、pformatがうまくいくか、cPickleを使うことができます。strは単純なケースでも動作します。必要なデータセットと効率に基づいて選択を行うことができます。
+0

ハッシュは一意であることが保証されていますか? –

+0

@PadraicCunningham最も実用的なケースでは、はい。 'hash'部分も削除することができます.json.dumpsとsort_keysも一意の文字列キーになります。 – DhruvPathak

関連する問題