【问题标题】:Nested lambda expressions in python map and reducepython map和reduce中的嵌套lambda表达式
【发布时间】:2011-07-02 11:07:09
【问题描述】:

我的代码当前包含,作为 while 循环条件的一部分:

reduce(operator.or_, map(lambda y: reduce(operator.or_, map(lambda x: x[0] == y, data[testedoffset:])), footers))

它的目的是检查一个给定的 python array.array 实例的切片是否包含几个特定字节值之一。

我得到的错误是:

NameError: global name 'y' is not defined

所以我很确定这是一个范围界定问题。但我想不出从这里做我想做的事的方法。

【问题讨论】:

  • 哇,这个表情吓到我了。谁会明白这一点?即使你似乎无法判断它是否在做你想做的事。采纳别人的建议,改写得更通俗易懂。
  • 如果您想为您的问题提供答案,请将其发布为 answer ,不要抹杀您的问题,因为这会使您收到的所有其他答案都“不合时宜”上下文噪音”。
  • 注意到,但我没有“抹杀”我的问题,我只是添加了一个标题,说明问题无效,我的问题与发布的代码无关。

标签: python arrays map slice reduce


【解决方案1】:

我知道你自己找到了答案,但是当你在这里时...... 该代码确实可以使用一些工作。

我不完全确定您为什么要在 footers 序列中基于 data[testedoffset:] 映射该表达式。这似乎没有任何影响,除非您的 __getitem__ 有副作用。

但是整个map + reduce + operator.or_ 的事情让我很胆小。

试试这样的:

y = 'whatever'
if any(x[0] == y for x in data[offset:]):
    print "yep, it's in there"

【讨论】:

  • 再想一想,我确实明白页脚在做什么。你可以这样写:any(x[0] == y for x in data[offset:] for y in footers)
  • 好吧,我不能按照你的建议去做,因为表达式是 while 循环的条件。不过谢谢你的帮助。
  • 什么? :) 你当然可以。忽略 if 语句。只需用 any(...) 表达式替换您的条件。它会工作的。我承诺。 :)
  • 喜欢:any(any(x == y[0] for x in data[offset:]) for y in footers) 有趣!我会记住这一点,以备将来使用。非常感谢。
  • 是的。这也有效......但请参阅我上面的第一条评论以获得更简单的版本。这些(一系列 x 的表达式)称为生成器推导,您可以在其中包含任意数量的“for”甚至“if”子句。
【解决方案2】:

这肯定不是范围界定问题,它显然是一个 unpythonic 表达式。 这是我理解它的尝试,我发现您必须将 y 传递给 lambda 表达式。

reduce(operator.or_,
       map(lambda y: reduce(operator.or_, map(lambda x: x[0] == y, data[testedoffset:]))
                ,#Where is y
           , footers))

【讨论】:

  • 实际上,我在读取行号时失败了,我的问题是在脚本的后面一点,我有另一个带有 y 的 lambda 不正确。
  • 即使对于这个表达式,对于lambda y:的map函数,你在哪里发送y,我知道footers是外层reduce。
  • lambda x: x[0] == y 是它被使用的地方。页脚用于外部地图,而不是外部减少。
  • Senthil,内部 lambda 中的 y 来自外部 lambda。但你是对的。这是非常不合情理的代码。 :)
  • 好的,知道了。页脚用于外部地图。感谢您指出这一点。
猜你喜欢
  • 2016-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多