例如,假设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)
。
答案 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