2012-05-04 45 views
4

有什麼方法可以使列表理解中的兩個或多個項目出列。具有多個變量的列表理解

I.e.我想要做這樣的事情:

>>> q = [1, 2, 3, 4] 
>>> r = [x+y for x, y in q] 
** This does not work though :(** 

預計:

>>> r 
[3, 7] 
+0

對於奇數長度列表預期溶液?例如,'q = [1,2,3,4,5]' –

+0

奇數長度列表 - >某種錯誤......只要它有些模糊不清,就不會過於臃腫。 –

回答

6

的建議您可以從itertools文檔中使用的石斑魚recipe

>>> from itertools import izip_longest 
>>> [x + y for x, y in grouper(2,q)] 
[3, 7] 

的源代碼爲配方是這樣的:

def grouper(n, iterable, fillvalue=None): 
    "grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx" 
    args = [iter(iterable)] * n 
    return izip_longest(fillvalue=fillvalue, *args) 
+0

非常好的通用解決方案:) –

+0

對於像'[1,2,3, 4,5]'你可以使用'[x + y代表x,y在石斑魚(2,q,0)]'中。 – akaRem

1

作品,如果列表中只有2如組。爲[1,2,3,4,5]不會工作,但會爲[1,2,3,4,5,6]

>>> q = [1, 2, 3, 4] 
>>> [x+y for x, y in zip(*[iter(q)]*2)] 
[3, 7] 

也通過工作@gnibbler

>>> map(sum, zip(*[iter(q)]*2)) 
+0

也許你可以用'fill_value = 0'試試'izip_longest'? '> [itertools.izip_longest(* [iter(q)] * 2,fillvalue = 0)]中的[sum(x)]' – Abhijit

+0

我可以做到這一點,但@MarkByers已經提交了解決方案。這個解決方案更好,如果你已經知道數據是在2. – jamylak

+1

也'映射(總和,拉鍊(* [iter(q)] * 2))' –

0

另一種解決方案

>>> [sum(q[i:i+2]) for i in range(0,len(q),2)] 
[3, 7] 
>>> q=[1,2,3,4,5] 
>>> [sum(q[i:i+2]) for i in range(0,len(q),2)] 
[3, 7, 5] 
+0

+1是啊!事實上'總和'是一個更好的方式來做到這一點,是時候刪除我的解決方案。 –

+0

特定問題的好解決方案:)但是,我正在尋找一些通用的東西。 –