如何比较python中的两个列表并返回不匹配

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/35713093/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-19 16:51:22  来源:igfitidea点击:

How can I compare two lists in python and return not matches

python

提问by TheTask1337

I would like to return values from both lists that not in the other one:

我想从两个列表中返回另一个不在另一个列表中的值:

bar = [ 1,2,3,4,5 ]
foo = [ 1,2,3,6 ]

returnNotMatches( a,b )

would return

会回来

[[ 4,5 ],[ 6 ]]

回答by zondo

Just use a list comprehension:

只需使用列表理解:

def returnNotMatches(a, b):
    return [[x for x in a if x not in b], [x for x in b if x not in a]]

回答by user3885769

One of the simplest and quickest is:

最简单和最快的方法之一是:

new_list = [
    list(set(list1).difference(list2))
]

回答by ?ukasz

This should do

这应该做

def returnNotMatches(a, b):
    a = set(a)
    b = set(b)
    return [list(b - a), list(a - b)]

And if you don't care that the result should be a list you could just skip the final casting.

如果你不关心结果应该是一个列表,你可以跳过最后的转换。

回答by mgilson

I might rely on the stdlib here...

我可能会在这里依赖 stdlib ......

from itertools import tee, izip
def pairwise(iterable):
    "s -> (s0,s1), (s1,s2), (s2, s3), ..."
    a, b = tee(iterable)
    next(b, None)
    return izip(a, b)

import difflib

def returnNotMatches(a, b):
    blocks = difflib.SequenceMatcher(a=a, b=b).get_matching_blocks()
    differences = []
    for b1, b2 in pairwise(blocks):
        d1 = a[b1.a + b1.size: b2.a]
        d2 = b[b1.b + b1.size: b2.b]
        differences.append((d1, d2))
    return differences

print returnNotMatches([ 1,2,3,4,5 ], [ 1,2,3,6 ])

which prints: [([4, 5], [6])]

打印: [([4, 5], [6])]

This compares the sequences as streams and finds the differences in the streams. It takes order into account, etc. If order and duplicates don'tmatter, then setsare by far the way to go (so long as the elements can be hashed).

这将序列作为流进行比较并找到流中的差异。这需要秩序考虑,等等。如果为了和副本没有事,然后sets是目前走(只要元素可以被散列)的方式。

回答by Aaron Lael

You could use a list comprehension and zip

您可以使用列表理解和 zip

''.join([i[0] for i in zip(a, a.lower()) if i[0] == i[1]])