我正在尝试编写一个函数来检查列表是否已排序(返回True
或False
)。如何避免多个变量指向同一个东西?
def is_sorted(t):
a = t
a.sort()
当我这样做时,会对a
和t
进行排序。我怎么能避免这个?
答案 0 :(得分:9)
以下是O(n)方法
>>> from itertools import islice, izip
>>> def is_sorted(L):
... return all(i<=j for i,j in izip(L, islice(L,1,None)))
...
>>> is_sorted(range(50))
True
>>> is_sorted(range(50)+[20])
False
它是短路的,所以如果列表在开头附近没有排序,那将非常快
这是一个比较一些替代方案的简单程序
import random
import time
from itertools import islice, izip
def is_sorted1(L): # 0.0006s
return all(i<=j for i,j in izip(L, islice(L,1,None)))
def is_sorted2(L): # 0.117s
return all(L[i] < L[i+1] for i in range(len(L)-1) )
def is_sorted3(L): # 2.344s
return L == sorted(L)
def is_sorted4(L): # 0.0002s
return all(L[i] < L[i+1] for i in xrange(len(L)-1) )
A = [range(random.randrange(100000)) for i in range(100)]
for a in A:
random.shuffle(a)
for f in is_sorted1, is_sorted2, is_sorted3, is_sorted4:
s=time.time()
for a in A:
f(a)
print time.time() - s
答案 1 :(得分:6)
编辑:请参阅this answer了解正确的方法。我会在这里留下我的答案给后人(处理这种情况的正确方法是什么?),但它不应该被认为是问题的最佳答案,即使它是正确的答案。问题
要回答您的具体问题,您可以使用copy.copy
(或使用切片语法[:]
)创建原始列表的副本:
import copy
def is_sorted(t):
a = copy.copy(t) # could also do: a = t[:]
a.sort()
return a == t
但是,更好的方法是使用sorted
函数返回列表的排序副本:
def is_sorted(t):
return sorted(t) == t
或者:is_sorted = lambda t: sorted(t) == t
答案 2 :(得分:3)
通过以下内容创建列表副本:
def is_sorted(t):
a = t[:] # create a copy
a.sort()
答案 3 :(得分:3)
这个最小答案的功劳属于@gnibbler
is_sorted = all(q[i] < q[i+1] for i in xrange(len(q)-1) )
答案 4 :(得分:2)
答案 5 :(得分:0)
在性能方面,这是一种非常差的方法,用于检查列表是否已订购。您应该迭代检查每个元素是否大于或等于前一个元素。