当前位置: 首页> 游戏> 评测 > 南京小程序建设_网络公司经营范围和管理条例_百度代理授权查询_semir是什么意思

南京小程序建设_网络公司经营范围和管理条例_百度代理授权查询_semir是什么意思

时间:2025/7/12 6:28:15来源:https://blog.csdn.net/weixin_52297428/article/details/147028914 浏览次数:0次
南京小程序建设_网络公司经营范围和管理条例_百度代理授权查询_semir是什么意思

任务

需要根据各个对象的某个属性来完成对整个对象列表的排序。

解决方案

DSU方法仍然一如既往地有效:

def sort_by_attr(sed,attr):intermed = [ (getattr(x,attr),i,x) for i,x in enumerate(seg)]intermed.sort()return [ x[-1] for x in intermed
def sort_by_attr_inplace(lst,attr):lst[:] = sort_by_attr(lst,attr)

由于 Python 2.4 的对 DSU 的原生支持,代码可以写得更短、跑得更快:

import operator
def sort_by_attr(seq,attr):return sorted(seq,key=operator.attrgetter(attr))
def sort_by_attr_inplace(lst,attr):lst.sort(key=operator.attrgetter(attr))

讨论

根据对象属性将对象排序的最佳方法仍然是 DSU,如同前面5.2节所介绍的。在Python2.3 和 2.4中,DSU 不再像过去那样,是用来确保排序的稳定性的方法了(因为从 Python2.3 开始,排序将一直保持稳定),但 DSU 的速度优势仍然如故。

排序,针对最普遍的用例,采用最好的算法,其时间复杂度是O(nlogn)(如同常见的数学公式一样,这里n和 logn 之间是相乘的关系)。通过使用 Python 原生的比较操作(也是最快的),DSU 的速度大多来自于对 O(nlogn)部分的加速,O(nlogn)决定着长度为n的序列的排序时间。在预备的 decoration阶段,即准备辅助的元组列表阶段,以及成功后的 undecoration 阶段,即在完成排序后的中间结果的列表的元组中取出需要的元素的阶段,时间复杂度仅仅是 O(n)。因此,如果n非常大,这两个阶段的一些低效的操作并不会造成很大的影响,在实际应用中,它们也确实影响甚微。

本节的方案是,给intermed 列表的每一个元素所在的元组中加入了一个索引i,位于对应的x之前(x是 seq的第i个元素)。这个举措保证了 seq 中任意两个子项都不会被直接用于比较,即使对同一个属性名 attr 它们都具有相同的值。在这种情况下,它们的索引仍然会保持不同,因此基于Python 的根据条目顺序比较(lexicographical comparison的规则,元组的最后一个元素(即 seq的元素)无须被用于比较。避免对象的比较将极大地提高性能。举个例子,我们可以根据real属性对一个复数列表进行排序。如果直接比较两个复数,我们会引发一个异常,因为复数之间并没有定义顺序。但是正如我们前面提到的,这样的情况永远不会发生,因此排序将会正确地进行下去。

5.2节曾经提到过,Python 2.4直接支持 DSU。可以传递一个可选的关键字参数 key 给sort,这样每个元素都可以用它来获取排序的键。标准库模块 operator 有两个新函数,attrgetter 和 itermgetter,它们被用来返回适用的可调用体。在 Python 2.4中,针对这个问题的解决方案就变成了:

import operator
seg.sort(key=operator.attrgetter(attr))

这个片段执行的排序是直接应用于原列表的,因此速度快得惊人——在我的计算机上比解决方案给出的第一个 Python2.3的函数快3倍。如果需要的是一个排序后的拷贝,而不想影响 seq,可以使用 Python 2.4 新的内建的 sorted 函数:

sorted_copy = sorted(seg,key=operator.attrgetter(attr))

不过它没有直接应用于原列表的排序快,这个代码片段比解决方案的第一个函数快 2.5倍。另外,Python 2.4保证了,如果传入了可选的key命名参数,列表的元素永远不会被直接比较,因此无须其他的安全保障。而且,排序的稳定性也是有保证的。

关键字:南京小程序建设_网络公司经营范围和管理条例_百度代理授权查询_semir是什么意思

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

责任编辑: