Python if else 语句在 reduce lambda 函数中不起作用

Python if else statement not working in reduce lambda function

我是 Python 中 lambdareduce 的新手,我不明白为什么这个功能不起作用:

def my_func(str):
    symbols = ['_', '-']
    return reduce(lambda x, y: ' ' + y if x in symbols else x + y, str)

my_func('foo_bar-baz')  # 'foo_bar-baz'

我预计输出为 'foo bar baz'

有人知道这里出了什么问题吗?

您似乎对 reduce 的函数参数的参数顺序感到困惑。第一个参数是 运行 总数,第二个是新数据。在您的示例中,x 是构建字符串,y 是新字符。

试试这个:

def my_func(str):
    symbols = ['_', '-']
    return reduce(lambda x, y: x + (' ' if y in symbols else y), str)

print my_func('foo_bar-baz')  # 'foo bar baz'

注意这里的错误:在第一次调用 lambda 表达式时,xstr[0],而 ystr[1]。因此,如果传入字符串中的第一个字符是一个符号,则不会对其进行翻译。

print my_func('-foo_bar-baz')
-foo bar baz

这可以通过向 reduce() 提供第三个参数来解决:

def my_func(str):
    symbols = ['_', '-']
    return reduce(lambda x, y: x + (' ' if y in symbols else y), str, '')

print my_func('foo_bar-baz')  # 'foo bar baz'
print my_func('-foo_bar-baz')  # ' foo bar baz'