比较Python中两个列表的每个项目

时间:2015-07-03 11:47:55

标签: python

例如,假设list_1 = [a,b,c]list_2 = [m,n,o]。我想比较一个列表中的每个项目,例如,创建一个输出列表

[a == m, a == n, a == o, b == m, b == n, b == o...]

为简单起见,我正在使用==操作,但这也可以是求和,例如

[a + m, a + n, a + o, b + m...]

我知道如何通过两个循环来实现这一点,但我想知道一个带有map()的lambda函数或者可以使用列表推导吗?我在网上搜索过,但只找到了列表项的一对一比较,例如: map(lambda x,y: x + y, list_1, list_2)

6 个答案:

答案 0 :(得分:6)

itertools.product()可以为您生成所有组合:

import itertools
list_1 = [1,5,4]
list_2 = [2,3,4]
# using list comprehensions
comparisons = [a == b for (a, b) in itertools.product(list_1, list_2)]
sums = [a + b for (a, b) in itertools.product(list_1, list_2)]
# using map and lambda
comparisons = map(lambda (a, b): a == b, itertools.product(list_1, list_2))
sums = map(lambda (a, b): a + b, itertools.product(list_1, list_2))

答案 1 :(得分:4)

使用列表推导来获取元素的所有排列:

[a == b for a in list_1 for b in list_2]

功能与嵌套for循环相同:

list_3 = []
for a in list_1:
    for b in list_2:
        list_3.append(a == b)  # Or a + b, etc.

功能实现有点混乱:

list_3 = map(lambda x: map(lambda y: y == x, list_2), list_1)

这会创建一个列表列表,因此您希望使用here

中描述的任何技术来展平它
sum(list_3, [])

或使用@bereal建议的itertools.product

答案 2 :(得分:3)

对于python 3.x - 是的,您可以使用map函数和itertools.product函数以及lambda表达式执行此操作 -

>>> lst1 = [1,5,4]
>>> lst2 = [2,3,4]
>>> lst3 = list(map(lambda x: x[0] == x[1] , itertools.product(lst1,lst2)))
>>> lst3
[False, False, False, False, False, False, False, False, True]

对于Python 2.x,您可以使用相同的表达式,只需在Python 2.x中的map函数返回一个列表,因此不需要list(...)

答案 3 :(得分:2)

您希望从两个列表的cartesian product对应用运算符。让我们说op定义了你想要应用于这两个项的操作,例如:

op = lambda x, y: x == y

并有两个列表

a = [1, 2, 3]
b = [2, 3, 4]

您可以将所有对上的op应用为列表推导,如下所示:

c = [op(x, y) for y in b for x in a]

要使用地图功能,首先需要使用itertools.product创建笛卡尔积。这有效地创建了两个列表元素的双循环,就像列表理解一样。您需要稍微调整op定义,因为它只接收一个由元组(x,y)组成的参数。例如:

op2 = lambda t: t[0] == t[1]
d = map(op2, itertools.product(a, b))

答案 4 :(得分:1)

你可以这样做:

list_1 = [1,2,3]
list_2 = [1,4,6]
is_it_equal_function = lambda x:x in list_1
is_it_equal_list = map(is_it_equal_function, list_2)

它将返回:

[True, False, False]

答案 5 :(得分:0)

如果我们喜欢矢量化的想法,可以尝试numpy:

import numpy as np
list_1 = ['a','b','c']
list_2 = ['m','n','o']
l1 = np.array(list_1)
l2 = np.array(list_2)
l1 == l2