如何在查找2个列表的差异时维护输出列表的顺序

Posted

技术标签:

【中文标题】如何在查找2个列表的差异时维护输出列表的顺序【英文标题】:How to maintain sequence of output list while finding the difference of 2 lists 【发布时间】:2019-12-04 12:06:39 【问题描述】:

我必须找出一个列表与另一个列表之间的区别。

但是每次我运行时,这个寻找差异的过程都会完全随机化我的输出。

下面是我的脚本

getALL = ["apple","ball","cat","dog","eagle"]  // initial list


Sourcee = ["eagle", "ball"]
diff = list(set(getALL) - set(Sourcee))
for items in diff:
    print(items)

有什么方法可以保持diff 列表的顺序与getALL 相同?

我想要这样的输出:

apple
cat
dog

【问题讨论】:

列表理解怎么样:[i for i in getALL if i not in Source]? preserving the order in difference between two lists in python的可能重复 【参考方案1】:

只需一个列表理解即可。可选择将Sourcee 转换为set 会使其更快

>>> source_set = set(Sourcee)
>>> [e for e in getALL if e not in source_set]
['apple', 'cat', 'dog']

【讨论】:

能否请您简单解释一下这部分[e for e in getALL if e not in source_set] 您只是遍历列表并获取其元素e,条件e not in source_set 为True。只有当元素e 不存在于source_set 中时,条件才会成立【参考方案2】:

set 操作不保持顺序。但是,您可以做的是通过检查原始列表中的顺序来重新构建差异列表。这适用于任意顺序。如果原始列表包含重复项,这会使事情变得复杂。

getALL = ["apple","ball","cat","dog","eagle"]  # initial list


Sourcee = ["eagle", "ball"]
diff = list(set(getALL) - set(Sourcee))

original_order_diff = [x for x in getALL if x in diff]

print(original_order_diff)

【讨论】:

【参考方案3】:

使用sorted:

diff = list(set(getALL) - set(Source))
for items in sorted(diff, key=getALL.index):
    print(items)

即便如此:

print('\n'.join([i for i in getALL if i not in Source]))

还有:

print(*[i for i in getALL if i not in Source], sep='\n')

将是最短的解决方案。

他们都输出:

apple
cat
dog

【讨论】:

以上是关于如何在查找2个列表的差异时维护输出列表的顺序的主要内容,如果未能解决你的问题,请参考以下文章

在python中使用线程时如何保留文件写入顺序

如何在mongodb中维护用户可自定义的实体顺序?

查找列表中连续数字之间的差异(Python)

如何使用“不在列表中”填充查找表

如何在c#中保持内部顺序的同时将2个排序的列表合并到一个随机列表中

在 Python 中查找列表的中位数