Python在机器学习中常用函数介绍

1、sorted函数

我们需要对List、Dict进行排序,Python提供了两个方法:
对给定的List进行排序,
方法1.用List的成员函数sort进行排序,在本地进行排序,不返回副本
方法2.用built-in函数sorted进行排序(从2.4开始),返回副本,原始输入不变

sorted(...)
    sorted(iterable, cmp=None, key=None, reverse=False) --> new sorted list

A. iterable

即迭代器,为可迭代类型,返回值是一个对iterable中元素进行排序后的列表(list)。Python的帮助文档中对iterable的解释是:iteralbe指的是能够一次返回它的一个成员的对象。iterable主要包括3类:

第一类是所有的序列类型,比如list(列表)、str(字符串)、tuple(元组)。
第二类是一些非序列类型,比如dict(字典)、file(文件)。
第三类是你定义的任何包含__iter__()或__getitem__()方法的类的对象。

B. cmp

可选参数。指定一个定制的比较函数,这个函数接收两个参数(iterable的元素),如果第一个参数小于第二个参数,返回一个负数;如果第一个参数等于第二个参数,返回零;如果第一个参数大于第二个参数,返回一个正数。默认值为None。
参数cmp不建议使用了,在python3.0被移除了,用参数key代替。 

C. key

可选参数。指定一个接收一个参数的函数,这个函数用于从每个List的每个元素中提取一个用于比较的关键字(属性或函数)。默认值为None。

D. reverse

可选参数。为一个布尔值,如果设置为True,列表元素将被倒序排列。
通常来说,key和reverse比一个等价的cmp函数处理速度要快。这是因为对于每个列表元素,cmp都会被调用多次,而key和reverse只被调用一次。
实例:

A. 基础排序

一个简单的升序排列很简单——只需要调用sorted()函数即可。 这个函数返回一个新的排序列表:
>>> sorted([5,2,3,1,4])
[1, 2, 3, 4, 5]
NOTE:也可以使用list的list.sort()方法。这个方法会修改原始的list(返回值为None)。通常这个方法不如sorted()方便——如果你不需要原始的list,list.sort()方法效率会稍微高一些。另一个区需要注意的在于list.sort()方法只为list定义,而sorted()函数可以接收任何的iterable。
>>> sorted({5: 'D', 3: 'B', 2: 'B', 1: 'E', 4: 'A'})
[1, 2, 3, 4, 5]

B. key使用

从Python2.4开始,list.sort()和sorted()方法都添加了一个key参数来说明一个函数,这个函数在做比较之前会对list中的每个元素进行调用。
>>> sorted("This is a test string from Andrew".split(), key=str.lower)
['a', 'Andrew', 'from', 'is', 'string', 'test', 'This']

key的值应该是一个函数,这个函数接收一个参数并且返回一个用于比较的关键字。这种技术比较快,原因在于对每个输入记录,这个函数只会被调用一次。

对复杂对象的比较通常是使用对象的切片作为关键字,例如:

>>> student_tuples = [('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)]
>>> sorted(student_tuples, key=lambda student: student[2])   # sort by age
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]

C. Operator模块中的函数

上面的key function模式很常见,因此Python提供了方便的函数使得祖先函数更简单和快捷。

operator module有itemgetter,attrgetter,以及从Python2.6开始的methodcaller函数。

使用 itemgetter和attrgetter可以加速排序,实现类似key function的功能,但减少代码的写作难度:

<pre class="python" name="code">>>> from operator import itemgetter, attrgetter  
>>> sorted(student_tuples, key=itemgetter(2))
>>> [('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]  
>>> sorted(student_objects, key=attrgetter('age')) 
>>> [('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]

 
  

以上为按第三域排列。

operator模块支持多级排序。例如先按成绩排序,再按年龄排序:

>>> sorted(student_tuples, key=itemgetter(1,2)) 
>>> [('john', 'A', 15), ('dave', 'B', 10), ('jane', 'B', 12)]  
>>> sorted(student_objects, key=attrgetter('grade', 'age'))
>>> [('john', 'A', 15), ('dave', 'B', 10), ('jane', 'B', 12)]

D. 升序与降序

list.sort()和sorted()都接收一个reverse参数。它是用于降序排序的标志。例如,为了获得学生年龄的降序排序:

>>> sorted(student_tuples, key=itemgetter(2), reverse=True)
>>> [('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)]  
>>> sorted(student_objects, key=attrgetter('age'), reverse=True)
>>> [('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)]

E. 排序稳定性和复杂的排序 从Python2.2开始,排序都保证是稳定的。意思是当多个记录有相同的关键字时,它们原始的排序保留。

>>> data = [('red', 1), ('blue', 1), ('red', 2), ('blue', 2)] 
>>> sorted(data, key=itemgetter(0))
>>> [('blue', 1), ('blue', 2), ('red', 1), ('red', 2)]

注意到两个'blue'的记录保留了它们原始的顺序,因此('blue',1)保证在('blue',2)之前。  这个好的特性能让你建立复杂的排序。例如,将学生记录按成绩降序排序、按年两升序排列。先按年龄排序,再按成绩排序:

>>> s=sorted(student_object,key=attrgettter('age')) # sort on secondary key
 >>> sorted(s,key=attrgetter('grade'),reverse=True)
>>> [('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]












评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值