2017-09-22 10 views
0

私は以前の質問でCSVの読み方とパンダの使い方について尋ねましたが、それが私の答えに近づいていましたが、それは私が探していたものではありませんでした。Pythonでリストのリストを交差させる最も効率的な方法は?

私は2つのリストがあります:私はこれらの事を取得するために探しています

a1 = [['1', 'foo'], ['2', 'bar'], ['3', 'Foo']] 
a2 = [['1', 'foo'], ['2', 'bar'], ['3', 'Foo'], ['4', 'Bar']] 

を:

  • A2にされていないA1のすべての項目は、最初の値
  • 上のすべてのアイテムを検索a2にa1にない、最初の値で検索する
  • a1とa2の両方にあるすべての項目は、最初の値で検索します。 この交差点において各項目、第二の値は、この交差点において各項目について
  • に一致しているすべてのアイテムのリストを、第二の値は
に一致されていないすべての項目のリストについて
  • CSVから私がPandasを使いたかったというデータを得ました。そして今、私はそれらを上記のリスト形式にしています。前もって感謝します!

+4

何を試しましたか?この質問はあなたの試みが欠けているので、SOコミュニティがあなたのために問題を解決したいと思うようです。 –

+0

[Python list intersection efficiency:generatorまたはfilter()?](https://stackoverflow.com/questions/6369527/python-list-intersection-efficiency-generator-or-filter)の重複の可能性あり – norok2

答えて

2

最も簡単な解決策は、セットに変換することである

a1 = [['1', 'foo'], ['2', 'bar'], ['3', 'Foo']] 
a2 = [['1', 'foO'], ['2', 'bar'], ['3', 'Foo'], ['4', 'Bar']] 

a1_set = set([v[0] for v in a1]) 
a2_set = set([v[0] for v in a2]) 

print("Items in a1,but not a2:",[x for x in a1 if x[0] in a1_set-a2_set]) 
print("Items in a2,but not a1:",[x for x in a2 if x[0] in a2_set-a1_set]) 

d1 = dict(a1) 
d2 = dict(a2) 
items_in_both = [(k,(d1[k],d2[k]) if d1[k] != d2[k] else d1[k]) for k in a2_set&a1_set] 

print("Items in both sets:", items_in_both) 
+2

https: //pypi.python.org/pypi/ordered-set/ orderを維持する – damians

+0

各サブリスト内の最初の項目でソートする場所について詳しく説明できますか? –

+0

オハイオ州私は見る...あなたの質問を十分に読んだことはありませんでした。 –

0

だから、基本的に使用すると、1つのリストにある要素を見つけたいといない他で:

[x for x in a2 if x not in a1] 

、あなたが共通したい場合あなたが使用できる要素:

[x for x in a2 if x in a1] 
+0

しかし、ここでの問題は、単一の値だけをソートすることです。私はリストのリストの中で最初の値をソートしたい。 –

関連する問題