2011-10-06 64 views
3

我想基于每个嵌套列表的最后值对嵌套列表结构进行排序。我的名单看起来是这样的:在Python列表中列出浮点数?

li = [['a1', 1, 1.56], ['b3', '6', 9.28], ['c2', 1, 6.25]...] 

我想输出是:

['b3', '6', 9.28] 
['c2', 1, 6.25] 
['a1', 1, 1.56] 

我曾尝试使用itemgetter像这样没有工作的几个解决方案:

rank_list = [i.sort(key=itemgetter(2)) for i in li] 

我究竟做错了什么?有没有更好的方法来排序嵌套列表?我得到一个AttributeError: 'str' object has no attribute 'sort'。谢谢您的帮助。

回答

4

你亲近你的方法之一,但你真正想要的是这样的:

li.sort(key = itemgetter(2), reverse = True) 
+0

排序工作到位,从其他答案'排序'返回一个列表。这种方法取决于你是想要一个新的列表,还是要对原件进行排序。 –

+0

非常感谢,这工作! – drbunsen

0
rank_list = sorted(li, key=itemgetter(2)) 
0

字符串不能进行排序,这就是AttributeError: 'str' object has no attribute 'sort'想告诉你。

要排序的listli

rank_list = sorted(li, key=itemgetter(2)) # to obtain a sorted copy of li 
# or just sort in place: 
li.sort(key=itemgetter(2)) 

不管你做什么它不是你贴什么,但:

>>> rank_list = [i.sort(key=itemgetter(2)) for i in li] 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
IndexError: string index out of range 
0

让我们澄清了我们对这个问题的思考。

[i.sort(key=itemgetter(2)) for i in li]

这意味着“取每个子列表和它的元素(列表和两个串)进行排序,使用每个作为密钥的第2项;累加来自那些操作的返回值的列表”。你的子列表的元素是整数和字符串; ints根本不是序列(所以你不能从它们那里得到一个项目),并且你的一些字符串太短(当我尝试你的例子时,我没有得到你引用的错误,而是“IndexError:字符串索引超出范围“,如预期的那样)。即使这样做有效,您只会得到None值的列表,因为列表中的.sort就地对列表进行排序并返回None

你想要的是“给我这个列表的每个元素排序的每一个版本的列表”。那是sorted(li, key=itemgetter(2))。列表清单是您正在排序的内容,所以这就是您传递给排序功能的内容。您希望排序给出一个新的值,而不是就地影响事物,因此您可以使用免费功能sorted