2013-04-29 67 views
0

從一些元組列表開始。如何根據元組的值排序列表

a = [(10,10),(20,20)] 
b = [(15,15),(25,25)] 

我們可以使用哪些列表理解創建一個新的列表,其中從a, b項目是按大小順序?

c = [(10,10),(15,15),(20,20),(25,25)] 
+0

什麼是 「大小」?第一個元素?第二個元素?元素的總和? – eduffy 2013-04-29 13:39:32

+0

它是否必須是理解?你有沒有理由不能使用'sort'? '(10,20)'和'(20,10)'有什麼相對順序? – Useless 2013-04-29 13:40:04

+0

你的兩個清單已經訂購了嗎? – jamylak 2013-04-29 13:42:01

回答

10

你並不需要這樣的理解,你可以簡單地做:

c = a + b 
c.sort() 
>> [(10, 10), (15, 15), (20, 20), (25, 25)] 

甚至更​​短:

c = sorted(a + b) 
>> [(10, 10), (15, 15), (20, 20), (25, 25)] 
1

你或許應該閱讀Sorting HOWTO。特別是關鍵功能部分可能是相關的,這取決於您如何定義「大小」。

2
from itertools import chain 

a = [(10,10),(20,20)] 
b = [(15,15),(25,25)] 
sorted(chain(a, b)) 
# [(10, 10), (15, 15), (20, 20), (25, 25)] 
+0

'c = a + b''c.sort()'會比這更快,而且效率也一樣。 – jamylak 2013-04-29 13:46:10

+0

@jamylak - 確實如此。但我想我會使用'鏈',如果有兩個以上的列表... – root 2013-04-29 13:50:28

+0

好點(這將是瘋狂的不)。只是說這種情況,雖然 – jamylak 2013-04-29 13:51:26

4

爲什麼列表理解?我不知道「大小」是什麼意思,所以我會猜測區域。

c = sorted(a+b, key=lambda x: x[0]*x[1]) 
+0

@jamylak - 糾正我,如果我錯了,但'operator.mul'期待* 2 *參數。使用它作爲關鍵只會傳遞1個參數。 – mgilson 2013-04-29 13:56:41

+0

這個答案原來是我真正需要的,但是問題答案是我所問的,所以我覺得有必要將他的帖子設置爲接受的答案。 – 2013-04-29 13:57:50

+1

@ user11177不覺得有責任做任何事情。接受解決你的問題的答案 – jamylak 2013-04-29 14:01:16

5

如果兩個名單已經在有序...

c = list(heapq.merge(a, b)) 

否則

c = sorted(itertools.chain(a, b)) 
+0

+1爲heapq。但是恐怕在這裏介紹heapq就像用激光槍炮射擊蒼蠅。更有效,但如何向他們解釋...... :) – 2013-04-29 13:45:57

+0

@JakubM。 heapq模塊的這種使用雖然非常簡單,但非常高效 – jamylak 2013-04-29 13:49:32

+0

@jamylak:我知道,我知道 – 2013-04-29 13:50:48

相關問題