我正在Python中进行一组差异操作:
x = [1, 5, 3, 4]
y = [3]
result = list(set(x) - set(y))
print(result)
我得到了:
[1, 4, 5]
如您所见,列表元素的顺序已更改。如何以原始格式保留列表x
?
答案 0 :(得分:18)
看起来您需要一个有序集而不是常规集。
>>> 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)
希望这会有所帮助: - )
答案 1 :(得分:14)
集合是无序的,因此在完成设置差异后,您需要以正确的顺序放回结果。幸运的是,你已经按照你想要的顺序拥有元素,所以这很容易。
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
创建y
的情况下执行此操作,但set
将提供快速成员资格测试,如果列表很大,这将为您节省大量时间。
答案 2 :(得分:5)
你可以这样做
diff = set(x) - set(y)
[item for item in x if item in diff]
或
filter(diff.__contains__, x)