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 回答