【问题标题】:python for loop using lambda syntaxpython for循环使用lambda语法
【发布时间】:2013-08-30 19:37:52
【问题描述】:

有没有办法做同样的事情

for i in range(len(x) // 4):
    a, b, c, d = x[i*4: i*4+4]

使用单行 lambda。是的,我想使用 lambda。

【问题讨论】:

  • 我只想说我认为在这里使用 lambda 是一个糟糕的选择。它只会降低可读性。除非您正在玩代码高尔夫,否则我认为没有理由这样做。仅仅因为某件事在一条线上并不能使它运行得更快。
  • 我使用 exec 将整个函数放入 lambda,但是它只返回循环中的第一项而不是所有项。你可以说它的外观
  • 这段代码除了分配abcd之外什么都不做——这就是你想在一行中发生的事情吗?
  • 是的,它需要在 for 循环中。有多个列表需要返回
  • 您的代码不会返回多个列表。它重复地将 x 的各个元素分配给 a、b、c 和 d。

标签: python function lambda


【解决方案1】:

看来 OP 意味着他的代码片段是一个循环框架,而不是他想要做的事情的完整代码。这可能更接近他的意图:

val = []
for c in range(len(x)//4):
    val.append(x[c*4:c*4+4])

for a, b, c, d in val:

    ...  do something with a, b, c, d  ...

对于上面他的 cmets 的示例列表:

x = ['1', '1377877381', 'off', '0', 
     '2', '1377886582', 'on', '0', 
     '3', '1376238596', 'off', '0', 
     '4', '1377812526', 'off', '0']

val 最终包含

[['1', '1377877381', 'off', '0'],
 ['2', '1377886582', 'on', '0'],
 ['3', '1376238596', 'off', '0'],
 ['4', '1377812526', 'off', '0']]

使用map()lambda 的等效行如下所示:

val = map(lambda y: x[y*4:y*4+4], range(len(x)//4))

现在可以循环调用 map,分配给 a、b、c、d,然后做任何事情:

for a, b, c, d in map(lambda y: x[y*4:y*4+4], range(len(x)//4)):

    ...  more code ...

希望能有所帮助。

当然,更有效的方法是使用itertools.imap()xrange()(在python 2.x 中。如果您使用的是Python 3.x,请保留它) "range.") 这种方法实际上并不构造完整的结果列表,但仍然允许对其进行迭代。

这是我的 Python 2.x 版本:

from itertools import imap

for a, b, c, d in imap(lambda y: x[y*4:y*4+4], xrange(len(x)//4)):

    ...  more code  ...

【讨论】:

  • 我能够正确使用val = list(map(lambda y: self.function_here(args[y*4:y*4+4]), range(len(args)//4)))。谢谢
猜你喜欢
  • 1970-01-01
  • 2013-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-01
  • 2022-12-09
  • 2016-02-18
  • 1970-01-01
相关资源
最近更新 更多