对不起,我有一个非常基本的python问题。在下面的程序中,我试图复制一个列表,然后按升序对其进行排序。我写的代码是:Python不会理解列表
def lesser_than(thelist):
duplicate = thelist[:]
duplicate = duplicate.sort()
return duplicate
它给了我的错误是,它无法排序无类型的东西。有谁知道为什么会发生这种情况?
对不起,我有一个非常基本的python问题。在下面的程序中,我试图复制一个列表,然后按升序对其进行排序。我写的代码是:Python不会理解列表
def lesser_than(thelist):
duplicate = thelist[:]
duplicate = duplicate.sort()
return duplicate
它给了我的错误是,它无法排序无类型的东西。有谁知道为什么会发生这种情况?
list.sort
排序清单并返回None
。这是一个常见的python约定 - 如果操作是就地的,python 通常返回None
。所以,你的代码应该是:
duplicate = thelist[:]
duplicate.sort() # Note, no assignment
return duplicate
或者,你可以使用sorted
:
return sorted(thelist)
由于sorted
已经返回一个排序的副本,你应该都好(具有支持任意iterables的附带好处而不是简单地列出...)
请注意,这里有一个轻微的命名约定。像sort
,reverse
这样的动词通常在适当的时候适当地进行操作 - 动词sorted
或reversed
进行复制。我不会说这个约定是无处不在的,但它至少与建宏存在...
什么情况是,sort()
排序列表就地,所以它不会返回一个新的列表。
你能做什么?
您可以使用sorted()
,它返回一个排序列表:
duplicate = sorted(duplicate)
或者,你可以使操作(duplicate.sort()
),并返回排序列表:
duplicate = thelist[:]
duplicate.sort()
return duplicate
这工作。非常感谢! – user3246935 2014-10-01 05:51:25
关于命名的好处 – mhawke 2014-10-01 05:54:53
@mhawke - 这实际上是我刚刚向我指出的一个小内容。这很有趣...我之前没有注意到它。 – mgilson 2014-10-01 05:59:12