如何在查找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个列表的差异时维护输出列表的顺序的主要内容,如果未能解决你的问题,请参考以下文章