私はPythonで差集合演算を行っています:
x = [1, 5, 3, 4]
y = [3]
result = list(set(x) - set(y))
print(result)
私は得ています:
[1, 4, 5]
ご覧のとおり、リスト要素の順序が変更されています。x
リストを元の形式で保持するにはどうすればよいですか?
通常のセットではなく、注文されたセットが必要なようです。
>>> x = [1, 5, 3, 4]
>>> y = [3]
>>> print(list(OrderedSet(x) - OrderedSet(y)))
[1, 5, 4]
Python には順序付きセットが付属していませんが、簡単に作成できます。
import collections
class OrderedSet(collections.Set):
def __init__(self, iterable=()):
self.d = collections.OrderedDict.fromkeys(iterable)
def __len__(self):
return len(self.d)
def __contains__(self, element):
return element in self.d
def __iter__(self):
return iter(self.d)
お役に立てれば :-)
セットは順序付けされていないため、セットの違いを実行した後、結果を正しい順序に戻す必要があります。幸いなことに、必要な順序で要素が既にあるので、これは簡単です。
diff = set(x) - set(y)
result = [o for o in x if o in diff]
しかし、これは合理化できます。リスト内包表記の一部として違いを確認できます (ただし、それがあなたが行っていることであるということは間違いなくわずかに明確ではありません)。
sety = set(y)
result = [o for o in x if o not in sety]
set
fromを作成せずに実行することもできますy
が、set
は高速なメンバーシップ テストを提供するため、いずれかのリストが大きい場合は時間を大幅に節約できます。
あなたはこれを行うことができます
diff = set(x) - set(y)
[item for item in x if item in diff]
また
filter(diff.__contains__, x)