Python比较列表

时间:2013-04-19 21:21:59

标签: python list compare

我想比较两个列表,并想知道一个元素是否与另一个元素相对应。

例如: 'a'应对应'b' 在这里,它将返回True。

list1 = [a,b,c,d]
list2 = [b,a,d,c]

'a'和'b'彼此对应(它们在列表上共享相同的位置)。如果函数对应,如何使函数返回True?

list1 = [a,b,c,d]
list2 = [c,d,a,b]

这将返回False。

8 个答案:

答案 0 :(得分:10)

我会这样做:

>>> from operator import eq
>>> list1 = ['a','b','c','d']
>>> list2 = ['c','d','a','b']
>>> any(map(eq, list1, list2))
False

当然,如果你想要完整的布尔'对应'列表,你可以简单地省略any函数:

>>> map(eq, list1, list2)
[False, False, False, False]

答案 1 :(得分:2)

首先,让我们构建一个迭代器,它将在a中为我们提供元素list1的位置:

# This is a generator expression: it works like a list, but uses O(1) memory
a_indexes = (i for i, x in enumerate(list1) if x == a)

现在,让我们确保list2中的那些索引比较等于b

# This returns a boolean
b_matches = all(list2[i] == b for i in a_indexes)

编辑:请注意a_indexes作为生成器而不是列表,只能使用一次。如果您想重复使用结果,请将()更改为[],或在生成器上调用list()

答案 2 :(得分:1)

这是你想要的吗?我假设ab每个只在list1list2分别出现一次。

def corresponding(list1,list2,a,b):
     return list1.index(a) == list2.index(b)

答案 3 :(得分:1)

以下是我提出的更新版本(满足您的示例用例):

def correspond(a, b):
    """Looks at two lists, if they are the same length and the length is even
    then it looks to make sure that the pairs are swapped (even if they are
    moved)

    >>> print correspond([1,2,3,4], [2,1,4,3])
    True
    >>> print correspond([1,2,3,4], [2,1,4,5]) #One value is out of place
    False
    >>> print correspond([1,2,3,4], [2,1,3])   #One value list is shorter
    False
    >>> print correspond([1,2,3,4], [3,4,1,2]) #values are moved but not swapped
    False
    >>> print correspond("ABCD", "BADC")
    True
    """
    if len(a) == len(b) and len(a) % 2 == 0:
        try:
            for i in xrange(0,len(a),2):
                if (1+b.index(a[i])) == b.index(a[i+1]):
                    return False

            return True
        except ValueError:
            return False
    else:
        return False

if __name__ == "__main__":
    import doctest
    doctest.testmod()

答案 4 :(得分:0)

您可以比较您认为应该对应的值的索引:

def in_correspondence(my_list1, my_list2, val1, val2):
    return my_list1.index(a) == my_list2.index(b)

答案 5 :(得分:0)

这样的东西可以给你你想要的东西:

import itertools as it

def are_related(first, second, a, b):
    a_indexes = (i for i,x in enumerate(first) if x == a)
    b_indexes = (i for i,x in enumerate(second) if x == b)
    return all(a_i == b_i for a_i, b_i in it.izip_longest(a_indexes, b_indexes))

请注意,使用itertools.izip_longest会考虑a或更多b的{​​{1}}或b以上a s的可能性。{/ { p>

答案 6 :(得分:0)

你的问题不明确,但我认为你想要的是:

first = 'a'
second = 'b'

list_one = ['a','b','c','d']
list_two = ['b','c','d','e']

if list_one.index(first) == list_two.index(second):
    print("They correspond")
else:
    print("They don't")

以上将忽略重复项(index返回它找到的第一个元素的位置。)

答案 7 :(得分:0)

list2[::2] == list1[1::2] and list1[::2] == list2[1::2]