Python:使用map等价物?

z2acfund  于 2023-05-27  发布在  Python
关注(0)|答案(2)|浏览(119)

我看到下面的代码:

>>> [(x, y) for x in [1,2,3] for y in [3,1,4] if x != y] 
[(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]

我还看到:

squares = list(map(lambda x: x**2, range(10)))
squares = [x**2 for x in range(10)]

我如何使用像下面代码那样的lambda函数完成第一个列表解析?

6g8kf2rb

6g8kf2rb1#

使用itertools.product()获取所有xy组合,使用filter()跳过x == y
在本例中不需要map(),因为itertools.product()已经创建了元组。

result = list(filter(lambda x: x[0] != x[1], itertools.product([1, 2, 3], [3, 1, 4])))
iyr7buue

iyr7buue2#

为什么你需要一个lambda(匿名)函数或一个函数到值的Map,如果你非常简单并且仍然可读的列表理解与美丽的if条件做得很好?
保持简单,保持良好。
如果你坚持使用maplambda作为你的具体示例,你可以(也不应该):

>>> a = [1,2,3]
>>> b = [3,1,4]
>>> [l for l in map(lambda o,p: (o,p) if o!=p else [], [i for j in [a,a[1::2],a[::-2],a[::-1]] for i in j], [d for c in [[k,k,k] for k in b] for d in c])if l]
[(1, 3), (2, 3), (2, 1), (3, 1), (3, 4), (2, 4), (1, 4)]

>>> list(filter(lambda o: o[0]!=o[1], zip([i for j in [a,a[1::2],a[::-2],a[::-1]] for i in j], [d for c in [[k,k,k] for k in b] for d in c])))
[(1, 3), (2, 3), (2, 1), (3, 1), (3, 4), (2, 4), (1, 4)]

不过,这显然是无稽之谈,好只是玩玩而已。是的,如果你愿意,你可以把它变得更复杂,在列表解析扩展中用它们自己的函数表示替换a和b。是的,如果你有可变长度的输入列表,这也可以做到--甚至更难读。

相关问题