首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >涉及map和reduce的Python怪癖

涉及map和reduce的Python怪癖
EN

Stack Overflow用户
提问于 2018-08-10 06:28:28
回答 1查看 69关注 0票数 2

很抱歉标题含糊,但我真的不知道这里发生了什么。

代码语言:javascript
复制
from functools import reduce

arr = [[0, 0, 0], [0, 0, 0], [0, 0, 0]]

def strxo(n):
    if (n == -1):
        return "X"
    elif (n == 1):
        return "O"
    else:
        return "_"

def prboard(board):
    print(reduce(lambda x, y: x + "\n" + y, list(map(lambda l: reduce(lambda a, b: strxo(a) + strxo(b), l), board))))

prboard(arr)

所需输出:

代码语言:javascript
复制
___
___
___

实际输出:

代码语言:javascript
复制
__
__
__

当我将strxo上的最后一个else改为return str(n)而不是return "_"时,我得到:

代码语言:javascript
复制
000
000
000

这是我所期望的,也是我想要的形状,但我想替换这些零。是什么导致了这种情况?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-10 06:40:41

问题是,您最内部的reduce函数,即作用于您的子列表的函数,总是将第二个参数转换为_

代码语言:javascript
复制
lambda a, b: strxo(a) + strxo(b)

因此,在reduce的最后一个元素中,b__,它被转换为_

您希望首先将strxo映射到所有内容上,然后使用连接进行缩减。

所以你想要这样的东西:

代码语言:javascript
复制
reduce(lambda x, y: x + "\n" + y, map(lambda l: reduce(lambda a, b: a + b, map(strxo, l)), board))

注意,我删除了对list的不必要调用。

但更重要的是,停止使用 reduce 和连接运算符来连接字符串!

它不必要地冗长,并且引导效率低下(它将具有二次时间复杂度)。

取而代之的是:

代码语言:javascript
复制
joinstr = ''.join

这是一个非常好的函数。函数式编程并不意味着“尽可能地使用map和reduce”。

所以,这里有一些很好的函数式编程:

代码语言:javascript
复制
joinstr = ''.join
join_newline = '\n'.join

def board_str(board):
    return join_newline(map(lambda l: joinstr(map(strxo,l)), board))

更好的是,你应该只使用列表理解,这是非常好的函数式结构(Python从Haskell那里偷来的)。它通常比map + lambda更具可读性

代码语言:javascript
复制
def board_string(board):
    return join_newline([joinstr(map(strxo, l)) for l in board])
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51776572

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档