29

次の Python データ構造があります。

data1 = [{'name': u'String 1'}, {'name': u'String 2'}]
data2 = [{'name': u'String 1'}, {'name': u'String 2'}, {'name': u'String 3'}]

2 つのリスト間のデルタを取得する最良の方法を探しています。Python で JavaScript Underscore.js (_.difference) ライブラリほど便利なものはありますか?

4

4 に答える 4

35

これはどう:

>>> [x for x in data2 if x not in data1]
[{'name': u'String 3'}]

編集

対称差が必要な場合は、次を使用できます。

>>> [x for x in data1 + data2 if x not in data1 or x not in data2]

また

>>> [x for x in data1 if x not in data2] + [y for y in data2 if y not in data1]

もう1つの編集

セットを使用することもできます:

>>> from functools import reduce
>>> s1 = set(reduce(lambda x, y: x + y, [x.items() for x in data1]))
>>> s2 = set(reduce(lambda x, y: x + y, [x.items() for x in data2]))

>>> s2.difference(s1)
>>> s2.symmetric_difference(s1)
于 2013-11-03T16:57:30.937 に答える
32

使用itertools.filterfalse:

import itertools

r = list(itertools.filterfalse(lambda x: x in data1, data2))
  + list(itertools.filterfalse(lambda x: x in data2, data1))

assert r == [{'name': 'String 3'}]
于 2013-11-03T16:59:17.377 に答える