python 内置排序函数使用python内置关于排序python比较列表函数的工具主要有两个一个是列表自带python比较列表函数的 sort() 方法python比较列表函数,另外一个是 sorted() 函数 。Python 列表内置方法可以直接修改列表 。而 sorted() 内置函数从一个可迭代对象(列表,元组等都可以)构建一个新的排序列表 。其函数原型分别如下python比较列表函数:
对列表进行默认排序
从函数原型来看 , 可以看到两者都具有两个可选参数,它们都必须指定为关键字参数 。
key 指定带有单个参数的函数 , 用于从 iterable 的每个元素中提取用于比较的键 (例如 key=str.lower) 。默认值为 None (直接比较元素) 。key 形参的值应该是个函数(或其python比较列表函数他可调用对象),它接受一个参数并返回一个用于排序的键 。
假设有其他类型的变量,比如一个自定义的类或者列表中又是一个列表 。以官网例子为例有这样一个列表 , 其元素为元组,
可以用以下方式按照年龄排序
类似的有自定义类
可以用如下方式进行排序
也可以显示定义一个函数,且只有一个参数,返回用于排序的键,比如
总之就是定义一个函数返回一个用于排序的键,可以用lambda函数或者 def 定义都可以 。
上面实现的简单函数实际就是实现了返回一个有序结构的第 n 的元素,或者某个类中的某个属性,因此 Python 提供了便利功能,使访问器功能更容易,更快捷 。operator 模块有 itemgetter() 、 attrgetter() 函数 。分别完成返回第 n 个元素 , 某个属性功能 。上面的排序可以用如下方式进行实现
在python2中,sort有一个 cmp 参数,即用一个函数来自定义比较 , 在python3中这种方式被取消 。为了继承类似的用法,在 Python 3.2 中,functools.cmp_to_key()函数被添加到标准库中的functools 模块中 。
这种作用先定义如何比较两个变量,以上面的学生列表按照年龄排序为例
这种做法自定义比较函数接收两个形参,返回比较结果(bool),而新式方法接受一个参数,返回的是比较的键 。
假设有字典 d = {'b':2, 'a':1,'c':8,'d':4},则可以通过以下方式对字典按照键和值进行排序
python中sort是什么意思python中sort()函数用于对原列表进行排序,如果指定参数,则使用比较函数指定的比较函数 。
列表有自己的sort方法,其对列表进行原址排序,既然是原址排序,那显然元组不可能拥有这种方法,因为元组是不可修改的 。
Python由荷兰数学和计算机科学研究学会的吉多·范罗苏姆于1990年代初设计 , 作为一门叫做ABC语言的替代品 。Python提供了高效的高级数据结构,还能简单有效地面向对象编程 。
Python判断列表是否已排序的各种方法及其性能本节判断列表排序的函数名格式为IsListSorted_XXX() 。为简洁起见,除代码片段及其输出外,一律以_XXX()指代 。
2.1 guess
def IsListSorted_guess(lst):
listLen = len(lst)if listLen = 1:return True
#由首个元素和末尾元素猜测可能的排序规则
if lst[0] == lst[-1]: #列表元素相同
for elem in lst:if elem != lst[0]: return False
elif lst[0]lst[-1]: #列表元素升序
for i, elem in enumerate(lst[1:]):if elemlst[i]: return False
else: #列表元素降序
for i, elem in enumerate(lst[1:]):if elemlst[i]: return False
return True
_guess()是最通用的实现,几乎与语言无关 。值得注意的是 , 该函数内会猜测给定列表可能的排序规则,因此无需外部调用者指明排序规则 。
2.2 sorted
def IsListSorted_sorted(lst):
return sorted(lst) == lst or sorted(lst, reverse=True) == lst
_sorted()使用Python内置函数sorted() 。由于sorted()会对未排序的列表排序,_sorted()函数主要适用于已排序列表 。
若想判断列表未排序后再对其排序,不如直接调用列表的sort()方法,因为该方法内部会判断列表是否排序 。对于已排序列表,该方法的时间复杂度为线性阶O(n)——判断为O(n)而排序为O(nlgn) 。
2.3 for-loop
def IsListSorted_forloop(lst, key=lambda x, y: x = y):
for i, elem in enumerate(lst[1:]):#注意,enumerate默认迭代下标从0开始
if not key(lst[i], elem): #if elemlst[i]更快,但通用性差
return False
return True
无论列表是否已排序,本函数的时间复杂度均为线性阶O(n) 。注意 , 参数key表明缺省的排序规则为升序 。
2.4 all
def IsListSorted_allenumk(lst, key=lambda x, y: x = y):
return all(key(lst[i], elem) for i, elem in enumerate(lst[1:]))import operatordef IsListSorted_allenumo(lst, oCmp=operator.le):
return all(oCmp(lst[i], elem) for i, elem in enumerate(lst[1:]))def IsListSorted_allenumd(lst):
return all((lst[i] = elem) for i, elem in enumerate(lst[1:]))def IsListSorted_allxran(lst, key=lambda x,y: x = y):
return all(key(lst[i],lst[i 1]) for i in xrange(len(lst)-1))def IsListSorted_allzip(lst, key=lambda x,y: x = y):
from itertools import izip #Python 3中zip返回生成器(generator),而izip被废弃
return all(key(a, b) for (a, b) in izip(lst[:-1],lst[1:]))
lambda表达式与operator运算符速度相当,前者简单灵活,后者略为高效(实测并不一定) 。但两者速度均不如列表元素直接比较(可能存在调用开销) 。亦即,_allenumd()快于_allenumo()快于_allenumk() 。
若使用lambda表达式指示排序规则,更改规则时只需要改变x和y之间的比较运算符;若使用operator模块指示排序规则 , 更改规则时需要改变对象比较方法 。具体地,lt(x, y)等效于xy,le(x, y)等效于x = y,eq(x, y)等效于x == y,ne(x, y)等效于x != y,gt(x, y)等效于xy , ge(x, y)等效于x = y 。例如 , _allenumo()函数若要严格升序可设置oCmp=operator.lt 。
此外,由all()函数的帮助信息可知,_allenumk()其实是_forloop()的等效形式 。
2.5 numpy
def IsListSorted_numpy(arr, key=lambda dif: dif = 0):
import numpytry:if arr.dtype.kind == 'u': #无符号整数数组执行np.diff时存在underflow风险
arr = numpy.int64(lst)except AttributeError:pass #无dtype属性,非数组
return (key(numpy.diff(arr))).all() #numpy.diff(x)返回相邻数组元素的差值构成的数组
NumPy是用于科学计算的Python基础包,可存储和处理大型矩阵 。它包含一个强大的N维数组对象,比Python自身的嵌套列表结构(nested list structure)高效得多 。第三节的实测数据表明,_numpy()处理大型列表时性能非常出色 。
在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
【python比较列表函数 python列表函数用法】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中a与1哪个大Python中可以使用cmp()函数比较两个列表的大小 。
cmp()函数语法:cmp(list1, list2)
参数:
list1 -- 比较的列表 。list2 -- 比较的列表 。
返回值:
如果比较的元素是同类型的,则比较其值,返回结果 。
如果两个元素不是同一种类型,则检查它们是否是数字 。
如果是数字,执行必要的数字强制类型转换,然后比较 。如果有一方的元素是数字,则另一方的元素"大"(数字是"最小的")否则,通过类型名字的字母顺序进行比较 。
如果有一个列表首先到达末尾,则另一个长一点的列表"大" 。
如果我们用尽了两个列表的元素而且所 有元素都是相等的,那么结果就是个平局,就是说返回一个 0 。
以下实例展示了 cmp()函数的使用方法:list1, list2 = [123, 'xyz'], [456, 'abc']print cmp(list1, list2
python 里面有没有比较两个列表的函数?仅限没有重复python比较列表函数的情况 。
gt;gt;gt; a=[1,2,3,4,5,6]
gt;gt;gt; b=[1,2,3]
gt;gt;gt; set(a)-set(b)
set([4, 5, 6])
如果要考虑重复python比较列表函数的话python比较列表函数,就有点麻烦python比较列表函数了python比较列表函数:
from math import fabs
def compare(list1,list2):
nbsp;nbsp;nbsp;dict1=dict()
nbsp;nbsp;nbsp;dict2=dict()
nbsp;nbsp;nbsp;total = list(set(list1 list2))
nbsp;nbsp;nbsp;dif = []
nbsp;nbsp;nbsp;for i in list1:
nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;if str(i) in dict1:
nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;dict1[str(i)]= 1
nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;else:
nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;dict1[str(i)] = 1
nbsp;nbsp;nbsp;for i in list2:
nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;if str(i) in dict2:
nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;dict2[str(i)]= 1
nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;else:
nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;dict2[str(i)] = 1
nbsp;nbsp;nbsp;for i in total:
nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;if str(i) not in dict1 or str(i) not in dict2:
nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;if str(i) in dict1:
nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;for num in range(int(dict1[str(i)])):
nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;dif.append(i)
nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;else:
nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;for num in range(int(dict2[str(i)])):
nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;dif.append(i)
nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;else:
nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;count = fabs(int(dict1[str(i)])-int(dict2[str(i)]))
nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;for num in range(int(count)):
nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;dif.append(i)
nbsp;nbsp;nbsp;return dif
a=[1,1,1,1,2,3,4,4,4,5,6,7,8,9]
b=[2,2,2,2,3,4,4,4,4,5,6,7,8,9,10,11]
print compare(a,b)
关于python比较列表函数和python列表函数用法的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站 。
推荐阅读
- sqlserver删除数据库失败,sqlserver删除数据库失败,因为该数据库引用
- 电脑怎么下载游戏,免费云电脑可玩大型游戏
- postgresql行变列,pgsql行列转换
- 人才报告go语言 人才报告分析
- sqlserver取mysql数据,mysql sql语句获取字段名
- jquery获得点击的元素,jquery获取鼠标点击的位置
- mysql怎么重建索引 mysql重建索引会影响查询吗
- mysql如何实现负载均衡,mysql 负载
- 放下网络游戏作文素材事例,关于网络游戏的作文素材