python内置函数降序 python 降序( 二 )


在Windows系统中可通过pip install numpy命令安装NumPy包,不建议登录下载文件自行安装 。
2.6 reduce
def IsListSorted_reduce(iterable, key=lambda x, y: x = y):
cmpFunc = lambda x, y: y if key(x, y) else float('inf')return reduce(cmpFunc, iterable, .0)float('inf')
reduce实现是all实现的变体 。累加器(accumulator)中仅存储最后一个检查的列表元素,或者Infinity(若任一元素小于前个元素值) 。
前面2.1~2.5小节涉及下标操作的函数适用于列表等可迭代对象(Iterable) 。对于通用迭代器(Iterator)对象,即可以作用于next()函数或方法的对象,可使用_reduce()及后面除_rand()外各小节的函数 。迭代器的计算是惰性的,只有在需要返回下一个数据时才会计算,以避免不必要的计算 。而且 , 迭代器方式无需像列表那样切片为两个迭代对象 。
2.7 imap
def IsListSorted_itermap(iterable, key=lambda x, y: x = y):
from itertools import imap, tee
a, b = tee(iterable) #为单个iterable创建两个独立的iterator
next(b, None)return all(imap(key, a, b))
2.8 izip
def IsListSorted_iterzip(iterable, key=lambda x, y: x = y):
from itertools import tee, izip
a, b = tee(iterable)next(b, None)return all(key(x, y) for x, y in izip(a, b))def pairwise(iterable):
from itertools import tee, izip
a, b = tee(iterable)next(b, None)return izip(a, b) #"s - (s0,s1), (s1,s2), (s2, s3), ..."def IsListSorted_iterzipf(iterable, key=lambda x, y: x = y):
return all(key(a, b) for a, b in pairwise(iterable))
第三节的实测数据表明,虽然存在外部函数调用 , _iterzipf()却比_iterzip()略为高效 。
2.9 fast
def IsListSorted_fastd(lst):
it = iter(lst)try:
prev = it.next()except StopIteration:return True
for cur in it:if prevcur:return False
prev = curreturn Truedef IsListSorted_fastk(lst, key=lambda x, y: x = y):
it = iter(lst)try:
prev = it.next()except StopIteration:return True
for cur in it:if not key(prev, cur):return False
prev = curreturn True
_fastd()和_fastk()是Stack Overflow网站回答里据称执行最快的 。实测数据表明,在列表未排序时,它们的性能表现确实优异 。
2.10 random
import randomdef IsListSorted_rand(lst, randNum=3, randLen=100):
listLen = len(lst)if listLen = 1:return True
#由首个元素和末尾元素猜测可能的排序规则
if lst[0]lst[-1]: #列表元素升序
key = lambda dif: dif = 0
else: #列表元素降序或相等
key = lambda dif: dif = 0
threshold, sortedFlag = 10000, True
import numpyif listLen = threshold or listLen = randLen*2 or not randNum:return (key(numpy.diff(numpy.array(lst)))).all()from random import samplefor i in range(randNum):
sortedRandList = sorted(sample(xrange(listLen), randLen))
flag = (key(numpy.diff(numpy.array([lst[x] for x in sortedRandList])))).all()
sortedFlag = sortedFlag and flagreturn sortedFlag
_rand()借助随机采样降低运算规模,并融入其他判断函数的优点 。例如 , 猜测列表可能的排序规则 , 并在随机采样不适合时使用相对快速的判断方式 , 如NumPy 。
通过line_profiler分析可知,第20行和第21行与randLen有关,但两者耗时接近 。因此randLen应小于listLen的一半,以抵消sorted开销 。除内部限制外,用户可以调节随机序列个数和长度 , 如定制单个但较长的序列 。
注意,_rand()不适用于存在微量异常数据的长列表 。因为这些数据很可能被随机采样遗漏,从而影响判断结果的准确性 。
在Python中实现函数reverse,number(),判断三位数ABC是否为“降序数”?找出组成这个三位数的数字就可以了
比如可以把这个三位数转换成字符串然后遍历,放到变量中

推荐阅读