2013-08-30 97 views
-4

循环是有办法做同样的事情,因为这蟒蛇使用lambda语法

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

使用单线拉姆达。和YES我想要使用lambda。

+1

我只想说,我认为在这里使用的λ是一个糟糕的选择。它所要做的就是降低可读性。除非你打高尔夫球,否则我没有理由这么做。仅仅因为某一行在某一行不会使其运行得更快。 – vroomfondel

+0

我使用exec将整个函数放入lambda中,但它只返回循环中的第一项而不是全部。你可以说它的外观 – user2602977

+1

这段代码除了指定'a','b','c'和'd'外什么都不做,就是你想在一行上发生什么? – Claudiu

回答

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 ... 

对于例如列表从他的上述评论:

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)) 

一个现在可以遍历这个调用映射,分配到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中,只要把它“的范围。 “)这种方法实际上并不构建完整的结果列表,但仍然允许迭代它。

这里是我的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 ... 
+0

我能够正确使用'val = list(map(lambda:self.function_here(args [y * 4:y * 4 + 4]),range(len(args)// 4)))'。谢谢 – user2602977

+0

很高兴帮助! –