2013-04-29 44 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