我正在寻找一个简单(快速)的方法来确定两个无序列表是否包含相同的元素:
例如:
['one', 'two', 'three'] == ['one', 'two', 'three'] : true
['one', 'two', 'three'] == ['one', 'three', 'two'] : true
['one', 'two', 'three'] == ['one', 'two', 'three', 'three'] : false
['one', 'two', 'three'] == ['one', 'two', 'three', 'four'] : false
['one', 'two', 'three'] == ['one', 'two', 'four'] : false
['one', 'two', 'three'] == ['one'] : false
我希望不用地图就能做到。
Python有一个内置的数据类型,用于(可哈希的)无序集合,称为集合。如果将两个列表都转换为集合,则比较将是无序的。
set(x) == set(y)
片场文件
编辑:@mdwhatcott指出你想检查重复。Set忽略了这些,所以您需要一个类似的数据结构来跟踪每个列表中的项的数量。这叫做多重集;标准库中最好的近似是集合。计数器:
>>> import collections
>>> compare = lambda x, y: collections.Counter(x) == collections.Counter(y)
>>>
>>> compare([1,2,3], [1,2,3,3])
False
>>> compare([1,2,3], [1,2,3])
True
>>> compare([1,2,3,3], [1,2,2,3])
False
>>>
如果你不想使用集合库,你可以这样做:
假设a和b是你的列表,下面返回匹配元素的数量(它考虑顺序)。
sum([1 for i,j in zip(a,b) if i==j])
因此,
len(a)==len(b) and len(a)==sum([1 for i,j in zip(a,b) if i==j])
如果两个列表相同,包含相同的元素并且顺序相同,则为True。否则错误。
因此,您可以像上面的第一个响应一样定义compare函数,但不包含collections库。
compare = lambda a,b: len(a)==len(b) and len(a)==sum([1 for i,j in zip(a,b) if i==j])
and
>>> compare([1,2,3], [1,2,3,3])
False
>>> compare([1,2,3], [1,2,3])
True
>>> compare([1,2,3], [1,2,4])
False
您希望查看它们是否包含相同的元素,但不关心顺序。
你可以使用一个集合:
>>> set(['one', 'two', 'three']) == set(['two', 'one', 'three'])
True
但是set对象本身只包含每个唯一值的一个实例,并且不会保持顺序。
>>> set(['one', 'one', 'one']) == set(['one'])
True
所以,如果跟踪副本/长度很重要,你可能还想检查长度:
def are_eq(a, b):
return set(a) == set(b) and len(a) == len(b)
假设您已经知道列表的大小相等,当且仅当两个向量完全相同(包括顺序)时,下面的语句将保证为True
functools.reduce(lambda b1,b2: b1 and b2, map(lambda e1,e2: e1==e2, listA, ListB), True)
例子:
>>> from functools import reduce
>>> def compvecs(a,b):
... return reduce(lambda b1,b2: b1 and b2, map(lambda e1,e2: e1==e2, a, b), True)
...
>>> compvecs(a=[1,2,3,4], b=[1,2,4,3])
False
>>> compvecs(a=[1,2,3,4], b=[1,2,3,4])
True
>>> compvecs(a=[1,2,3,4], b=[1,2,4,3])
False
>>> compare_vectors(a=[1,2,3,4], b=[1,2,2,4])
False
>>>