我想比较两个列表,并想知道一个元素是否与另一个元素相对应。
例如: '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。
答案 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)
a
和b
每个只在list1
和list2
分别出现一次。
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]