为什么在Python中使用(dictionary.keys()).sort()无法运行?

3

我是Python的新手,不明白为什么这样的事情不起作用。我也找不到其他地方提出的问题。

toto = {'a':1, 'c':2 , 'b':3}
toto.keys().sort()           #does not work (yields none)
(toto.keys()).sort()         #does not work (yields none)
eval('toto.keys()').sort()   #does not work (yields none)

然而,如果我检查类型,我会发现我在列表上调用了sort(),那么问题是什么。

toto.keys().__class__     # yields <type 'list'>

我唯一能让这个工作的方法是添加一些丑陋的临时变量

temp = toto.keys()
temp.sort()

我在这里错过了什么,一定有更好的方法来完成它。


我不确定解决方案,但是字典键不是无序的吗? - fauxCoder
1
@Shraptnel:你说得对。OP把键放入列表中并对该列表进行排序。 - mechanical_meat
3个回答

6
sorted(toto.keys())

应该可以满足你的需求。你使用的排序方法是就地排序并返回None。


1
另外,如果字典很大,可以使用sorted(toto.iterkeys())来防止创建和销毁未排序的键列表。 - Chris Lutz
1
在Python 2.6和3.x中,您只需使用sorted(toto)即可获得相同的结果。实际上,使用.keys()已被弃用。 - jathanism

6

sort()方法会直接对列表进行排序,不会返回新的已排序副本,所以它的返回值为None。这样设计是为了避免让你误认为原始列表没有被修改。


1

sort() 方法会就地排序,返回 none。你需要使用 sorted(toto.keys()),它会返回一个新的可迭代对象,已经排好序了。


有没有办法保留类似的后缀表达式?例如对于len可以使用 alist.len()而不是 len(alist) - nicolas
1
如果你在调用 l.len(),那么意味着你的方法不正确。 - Stefano Borini
好的,谢谢你的建议。但我很难不使用后缀表示法,例如alist.map().filter().sort().map().len(),它将操作符放在其参数附近,非常方便,而不是operation1(operation2(operation3(arg, arg3), arg2),arg1)这样的形式。 - nicolas
你想要做的是所谓的方法链式调用。这是一种模式,没有任何标准的Python类型实现它。 - Stefano Borini

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接