2013-08-30 131 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

很高興幫助! –