-2

私は2つのリストを持っています:

l1=[[12,3,C,-],[10,2,A,-]]
l2=[[8,3,X,W],[15,2,Y,W],[16,2,X,W],[17,3,V,W],[20,2,Z,W],[21,1,V,W].......]

ここで、これら 2 つのリストを比較し、一致しない部分を l2 から新しいリストにフェッチしたいと考えています。つまり、l1[1] とフィールド l2[1] を一致させ、一致しないリストを返す必要があります。一致とは、l1 のサブリストの 2 番目の位置にある要素が、l2 のサブリストの同じ位置と比較された場合、それを無視し、一致しないものはすべて返さなければならないことを意味します。実際には、比較要素を取得するために両方のリストを反復処理する必要があります。たとえば、l1 の 3,2 と比較すると、2 番目の位置要素 1 のサブリストが返されます。これが私のアプローチです。

l3=[x for x in l2 if x[1] not in l1[1]]

しかし、一致した部分も返ってきます。何が問題なのですか?

4

2 に答える 2

1
l1=[[12,3,C,-],[10,2,A,-]]
l2=[[8,3,X,W],[15,2,Y,W],[16,2,X,W],[17,3,V,W],[20,2,Z,W],[21,1,V,W]]

アプローチは近かったが、map関数を使用して 2 番目の要素のリストを作成したいl1

l3=[x for x in l2 if x[1] not in map( lambda y: y[1], l1) ]

Notemapは関数とシーケンスを受け取り、シーケンスの各メンバー (つまり、 の各サブリストの 2 番目の要素) に適用されると、関数の結果のリストを返しますl1l1が非常に大きい場合は、重複を削除してメンバーシップ チェック O(1) を行う 2 番目の要素のセットを作成できます。

l1set = set( map( lambda y: y[1], l1) )

の作成は次のl3ようになります。

l3=[x for x in l2 if x[1] not in l1set ]
于 2014-07-20T18:51:10.507 に答える
1

一致とは、l1 のサブリストの 2 番目の位置にある要素が、l2 のサブリストの同じ位置と比較された場合、それを無視し、一致しないものはすべて返さなければならないことを意味します。

質問へのコメントに上記のステートメントを追加することを検討してください

最初のリストを重要な要素のリストに減らします。リストがかなり大きい場合は、セットにしてください

2番目のリストをトラバースし、メンバーシップ演算子を使用して削減されたリストと比較してフィルタリングします

>>> l1=[[12,3,'C','-'],[10,2,'A','-']]
>>> l2=[[8,3,'X','W'],[15,2,'Y','W'],[16,2,'X','W'],[17,3,'V','W'],[20,2,'Z','W'],[21,1,'V','W']]
>>> key = set(e[1] for e in l1)
>>> [e for e in l2 if e[1] not in key]
[[21, 1, 'V', 'W']]
于 2014-07-20T18:49:56.520 に答える