使用Python的设置差异时保留顺序

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用Python的设置差异时保留顺序相关的知识,希望对你有一定的参考价值。

我正在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创建y的情况下执行此操作,但set将提供快速成员资格测试,如果任一列表很大,这将为您节省大量时间。

另一答案

你可以这样做

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

要么

filter(diff.__contains__, x)

以上是关于使用Python的设置差异时保留顺序的主要内容,如果未能解决你的问题,请参考以下文章

scrapy按顺序启动多个爬虫代码片段(python3)

导航组件 - BottomNavigationView - 返回时不要保留 startDestination 片段

保留键顺序:使用 Python 脚本将 JSON 数据加载到 Snowflake VARIANT 列中

使用 BottomNavigationView 在它们之间切换时保留片段状态

“不要保留活动” - 当应用程序恢复时,片段仅可见一秒钟

在方向更改时保留列表片段中的列表