我正在Python中进行集合差异操作:
x = [1, 5, 3, 4]
y = [3]
result = list(set(x) - set(y))
print(result)
Run Code Online (Sandbox Code Playgroud)
我越来越:
[1, 4, 5]
Run Code Online (Sandbox Code Playgroud)
我需要获得下一个操作的第一个元素,这很重要.如何x以原始格式保留列表?
Ray*_*ger 19
看起来你需要一个有序集而不是常规集.
>>> x = [1, 5, 3, 4]
>>> y = [3]
>>> print(list(OrderedSet(x) - OrderedSet(y)))
[1, 5, 4]
Run Code Online (Sandbox Code Playgroud)
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)
Run Code Online (Sandbox Code Playgroud)
希望这可以帮助 :-)
kin*_*all 15
集合是无序的,因此您需要在设置差异后将结果以正确的顺序放回.幸运的是,您已经按照所需的顺序拥有元素,因此这很容易.
diff = set(x) - set(y)
result = [o for o in x if o in diff]
Run Code Online (Sandbox Code Playgroud)
但这可以简化; 作为列表理解的一部分,你可以做出不同的事情(虽然可以说你正在做的事情稍微不那么明确).
sety = set(y)
result = [o for o in x if o not in sety]
Run Code Online (Sandbox Code Playgroud)
您甚至可以在不创建setfrom的情况下执行此操作y,但set会提供快速成员资格测试,如果任一列表很大,这将为您节省大量时间.
你可以这样做
diff = set(x) - set(y)
[item for item in x if item in diff]
Run Code Online (Sandbox Code Playgroud)
要么
filter(diff.__contains__, x)
Run Code Online (Sandbox Code Playgroud)