17

私はPythonで差集合演算を行っています:

x = [1, 5, 3, 4]
y = [3]

result = list(set(x) - set(y))
print(result)

私は得ています:

[1, 4, 5]

ご覧のとおり、リスト要素の順序が変更されています。xリストを元の形式で保持するにはどうすればよいですか?

4

3 に答える 3

25

通常のセットではなく、注文されたセットが必要なようです。

>>> 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)

お役に立てれば :-)

于 2012-04-04T07:27:33.123 に答える
18

セットは順序付けされていないため、セットの違いを実行した後、結果を正しい順序に戻す必要があります。幸いなことに、必要な順序で要素が既にあるので、これは簡単です。

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]

setfromを作成せずに実行することもできますyが、setは高速なメンバーシップ テストを提供するため、いずれかのリストが大きい場合は時間を大幅に節約できます。

于 2012-04-04T05:36:06.290 に答える
9

あなたはこれを行うことができます

diff = set(x) - set(y)
[item for item in x if item in diff]

また

filter(diff.__contains__, x)
于 2012-04-04T05:35:31.413 に答える