涉及地图和热度的Python怪

2024-09-30 01:28:00 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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)

期望输出:

___
___
___

实际输出:

__
__
__

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

000
000
000

这正是我所期望的和我想要的形状,但我想替换那些零。是什么原因造成的?你知道吗


Tags: lambdafromimportboard标题reducereturnif
1条回答
网友
1楼 · 发布于 2024-09-30 01:28:00

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

lambda a, b: strxo(a) + strxo(b)

所以,在reduce的最后一个元素上,b__,它变成了_!你知道吗

您想先将映射到strxo上,然后使用串联减少。你知道吗

所以你想要这样的东西:

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

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

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

这是不必要的冗长,而且引导效率低下(它将具有二次时间复杂性)。你知道吗

相反,请使用:

joinstr = ''.join

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

下面是一些很好的函数式编程:

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更易读:

def board_string(board):
    return join_newline([joinstr(map(strxo, l)) for l in board])

相关问题 更多 >

    热门问题