[英]How can I compare two lists in python and return not matches
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 ]]
One of the simplest and quickest is:最简单和最快的方法之一是:
new_list = list(set(list1).difference(list2))
BONUS!奖金! If you want an intersection (return the matches):如果你想要一个交叉点(返回匹配项):
new_list = list(set(list1).intersection(list2))
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]]
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.如果你不关心结果应该是一个列表,你可以跳过最后的转换。
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't matter, then sets
are by far the way to go (so long as the elements can be hashed).这需要秩序考虑,等等。如果为了和副本并不重要,那sets
是目前走(只要元素可以被散列)的方式。
您可以使用列表理解和 zip
''.join([i[0] for i in zip(a, a.lower()) if i[0] == i[1]])
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.