【问题标题】:Python if else statement not working in reduce lambda functionPython if else 语句在 reduce lambda 函数中不起作用
【发布时间】:2017-01-17 21:36:47
【问题描述】:

我是 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'

有人明白这里出了什么问题吗?

【问题讨论】:

  • 请记住,str 是内置的,因此您可能不应该将变量/参数命名为
  • if x in symbols - x?为什么x
  • 你为什么期待foo bar baz?您期望将 lambda 应用于输入 'foo''_' 的结果是什么?将 lambda 应用于输入 'foo''_' 的实际结果是什么?
  • 为什么不使用replacere.sub

标签: python lambda reduce


【解决方案1】:

您似乎对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'

【讨论】:

  • 您可能希望使用'' 作为启动器(第三个参数),以处理字符串开头的_-
  • @Robᵩ 抱歉。
  • 你是对的。我希望 x 是字符串的当前位置,而 y 是下一个。现在我懂了。我认为在 JS 中有点不同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-29
  • 2015-05-12
  • 2023-04-03
  • 2023-03-13
  • 2015-05-05
相关资源
最近更新 更多