严格比较python中两个列表的所有元素,而不考虑它们的顺序

时间:2016-12-31 08:21:33

标签: python list set

如何比较列表之间的每个值。它应该完全匹配。

list1 = ['same1', 'same2']
list2 = ['notsame1', 'notsame2']
list3 = ['same1', 'same2']

def comp(list1, list2, list3):
    if set(list1) & set(list2):
        print  "Train A is active and instances are %s." % list2
    elif set(list1) & set(list3):
        print  "Train B is active and instances are %s." % list3
    else :
        print "No Trains are active"
comp(list1, list2, list3)

尽管我在list3 = ['not_same1', 'same2']

中有一个不同的值,但上面的代码仍会将列车B返回为活动状态

看起来它只是检查列表中的一个值,如何比较所有元素,即使元素没有按顺序排列。

看起来**set**已被弃用,欢迎使用其他任何方式。

4 个答案:

答案 0 :(得分:1)

使用等式检查set(list1)==set(list2)代替交叉set(list1) & set(list2)

答案 1 :(得分:1)

只需使用==即可获得所需内容。它直接比较两个序列的值:

list1 = ['same1', 'same2']
list2 = ['notsame1', 'notsame2']
list3 = ['same1', 'same2']

def comp(list1, list2, list3):
    if list1 == list2:
        print(  "Train A is active and instances are %s." % list2)
    elif list1 == list3:
        print(  "Train B is active and instances are %s." % list3)
    else :
        print( "No Trains are active")
comp(list1, list2, list3)

答案 2 :(得分:1)

  

如何比较所有元素,即使元素没有按顺序排列。

这是一种在不使用设置的情况下比较3个数组的方法。

def compareArrays(list1, list2):
    for item in list1:
        if not item in list2:
            return False # The array's don't match
    return True # The array's match

def comp(list1, list2, list3):
    if compareArrays(list1, list2):
        print(  "Train A is active and instances are %s." % list2)
    elif compareArrays(list1, list3):
        print(  "Train B is active and instances are %s." % list3)
    else:
        print( "No Trains are active")

list1 = ['same1', 'same2']
list2 = ['notsame1', 'notsame2']
list3 = ['same1', 'same2']

comp(list1, list2, list3)

答案 3 :(得分:1)

您可以直接将集合与==进行比较。由于集合删除了多个值,因此在尝试转换为它们之前,先检查两个列表是否具有相同的长度:

from __future__ import print_function


def comp(list1, list2, list3):
    if len(list1) == len(list2) and set(list1) == set(list2):
        print("Train A is active and instances are %s." % list2)
    elif len(list1) == len(list3) and set(list1) == set(list3):
        print("Train B is active and instances are %s." % list3)
    else :
        print("No Trains are active")

运行一些测试:

def test(list1, list2, list3):
    print('#' * 10)
    print('list1', list1)
    print('list2', list2)
    print('list3', list3)
    comp(list1, list2, list3)

list1 = ['same1', 'same2']
list2 = ['notsame1', 'notsame2']
list3 = ['same1', 'same2']
test(list1, list2, list3)
list2 = ['same1', 'same2']
test(list1, list2, list3)
list2 = ['same1', 'same2', 'same2']
test(list1, list2, list3)
list2 = ['notsame1', 'notsame2']
list3 = ['same1', 'same2', 'same2']
test(list1, list2, list3)

输出:

##########
list1 ['same1', 'same2']
list2 ['notsame1', 'notsame2']
list3 ['same1', 'same2']
Train B is active and instances are ['same1', 'same2'].
##########
list1 ['same1', 'same2']
list2 ['same1', 'same2']
list3 ['same1', 'same2']
Train A is active and instances are ['same1', 'same2'].
##########
list1 ['same1', 'same2']
list2 ['same1', 'same2', 'same2']
list3 ['same1', 'same2']
Train B is active and instances are ['same1', 'same2'].
##########
list1 ['same1', 'same2']
list2 ['notsame1', 'notsame2']
list3 ['same1', 'same2', 'same2']
No Trains are active