2012-03-22 61 views
11

是否有任何聰明的方法來寫一個列表理解在多個列表中?在一個列表理解中的多個列表的Python值

我知道我可以使用一個單獨的範圍列表作爲索引,但這種方式我必須知道長度(或單獨獲取它與len()函數調用)。

>>> a = range(10) 
>>> b = range(10, 0, -1) 
>>> [(a[x],b[x]) for x in range(10)] 
[(0, 10), (1, 9), (2, 8), (3, 7), (4, 6), (5, 5), (6, 4), (7, 3), (8, 2), (9, 1)] 

我很想有這樣的事情:

>>> [(a,b) for a in range(10) and b in range(10, 0, -1)] 
[(0, 10), (1, 9), (2, 8), (3, 7), (4, 6), (5, 5), (6, 4), (7, 3), (8, 2), (9, 1)] 

你會如何寫列表理解?有沒有辦法用itertools做到這一點?

範圍列表只是代表任何列表,我不一定想得到一個元組。也可能有一個函數,它將a和b作爲參數。所以zip不是我想要的。

更新:「因此,拉鍊不是我想要的。」我的意思是,我不想zip(range(10), range(10, 0, -1))

+0

重複的[9184497](http://stackoverflow.com/questions/9184497/python-list-comprehension-function-with-參數功能於兩個列表)? – quazgar 2013-04-08 07:30:43

回答

20

你舉的例子就是:

zip(range(10), range(10, 0, -1)) 

更一般地,你可以使用zip加入任何一組iterables的:

[func(a, d, ...) for a, b, ..., n in zip(iterable1, iterable2, ..., iterableN)] 
+1

第二種解決方案就是我想要的。非常感謝。 – dominik 2012-03-22 16:58:09

+0

您可能需要考慮['itertools.izip'](http://docs.python.org/library/itertools.html#itertools.izip),因爲它在大型序列中更好。相同的想法,只是一個稍微不同的工具。 – 2012-03-22 17:01:09

+0

我想你可能已經想寫''func(a,b,...)for a,b,...,n in zip(iterable1,iterable2,...,iterableN)]' – 2015-08-25 17:32:49

1

如果你想申請一個函數到幾個序列,你需要或者map或者itertools.imap

map(lambda *x: sum(x), range(10), range(10, 0, -1), range(0,20, 2)) 

有沒有必要壓縮,除非你喜歡做你的映射在列表理解

+0

這不是他想要什麼。看看他的第二個例子 - 他想'拉鍊'。而且你永遠不需要'map',列表理解/生成器表達式可以完成它所能做的所有事情。 – agf 2012-03-22 21:52:14

+1

@agf「也可能有一個函數需要a和b作爲參數,所以zip不是我想要的。」你可以爭辯說,一個也不需要zip,因爲地圖是可用的。 – Marcin 2012-03-22 21:57:39

+0

他寫道,在我添加我的第二個例子之前,展示瞭如何使用帶有'zip'的函數。閱讀他對我寫的答案的評論後,我添加它。他的意思是他不想要_just_'zip',並不是說他根本不想'zip'。 – agf 2012-03-22 21:59:02