[转]python sort reverse

2.3.3 列表方法(2)

7. remove

remove方法用于移除列表中某个值的第一个匹配项:

 
 
  1. >>> x = ['to', 'be', 'or', 'not', 'to', 'be']  
  2. >>> x.remove('be')  
  3. >>> x  
  4. ['to', 'or', 'not', 'to', 'be']  
  5. >>> x.remove('bee')  
  6. Traceback (innermost last):  
  7. File "<pyshell#3>", line 1, in ?  
  8. x.remove('bee')  
  9. ValueError: list.remove(x): x not in list 

可以看到:只有第一次出现的值被移除了,而不存在于列表中的值(比如例子中的"bee")是不会移除的。

值得注意的是,remove是一个没有返回值的原位置改变方法。它修改了列表却没有返回值,这与pop方法相反。

8. reverse

reverse方法将列表中的元素反向存放(我猜你们对此不会特别惊讶):

 
 
  1. >>> x = [1, 2, 3]  
  2. >>> x.reverse()  
  3. >>> x  
  4. [3, 2, 1] 

请注意,该方法也改变了列表但不返回值(就像remove和sort)。

提示 如果需要对一个序列进行反向迭代,那么可以使用reversed函数。这个函数并不返回一个列表,而是返回一个迭代器(iterator)对象(第9章介绍了更多关于迭代器的内容)。尽管如此,使用list函数把返回的对象转换成列表也是可行的:

 
 
  1. >>> x = [1, 2, 3]  
  2. >>> list(reversed(x))  
  3. [3, 2, 1] 

9. sort

sort方法用于在原位置 对列表进行排序。在"原位置排序"意味着改变原来的列表,从而让其中的元素能按一定的顺序排列,而不是简单地返回一个已排序的列表副本。

 
 
  1. >>> x = [4, 6, 2, 1, 7, 9]  
  2. >>> x.sort()  
  3. >>> x  
  4. [1, 2, 4, 6, 7, 9] 

前面介绍过了几个改变列表却不返回值的方法,在大多数情况下这样的行为方式是很合常理的(例如append方法)。但是,sort方法的这种行为方式需要重点讲解一下,因为很多人都被sort方法弄糊涂了。当用户需要一个排好序的列表副本,同时又保留原有列表不变的时候,问题就出现了。为了实现这个功能,我们自然而然就想到了如下的做法(实际是错误的):

 
 
  1. >>> x = [4, 6, 2, 1, 7, 9]  
  2. >>> y = x.sort() # Don't do this!  
  3. >>> print y  
  4. None 

因为sort方法修改了x却返回了空值,那么最后得到的是已排序的x以及值为None的y。实现这个功能的正确方法是,首先把x的副本赋值给y,然后对y进行排序,如下例所示:

 
 
  1. >>> x = [4, 6, 2, 1, 7, 9]  
  2. >>> y = x[:]  
  3. >>> y.sort()  
  4. >>> x  
  5. [4, 6, 2, 1, 7, 9]  
  6. >>> y  
  7. [1, 2, 4, 6, 7, 9] 

再次调用x[:]得到的是包含了x所有元素的分片,这是一种很有效率的复制整个列表的方法。只是简单地把x赋值给y是没用的,因为这样做就让x和y都指向同一个列表了。

 
 
  1. >>> y = x 
  2. >>> y.sort()  
  3. >>> x  
  4. [1, 2, 4, 6, 7, 9]  
  5. >>> y  
  6. [1, 2, 4, 6, 7, 9] 

另一种获取已排序的列表副本的方法是,使用sorted函数:

 
 
  1. >>> x = [4, 6, 2, 1, 7, 9]  
  2. >>> y = sorted(x)  
  3. >>> x  
  4. [4, 6, 2, 1, 7, 9]  
  5. >>> y  
  6. [1, 2, 4, 6, 7, 9] 

这个函数实际上可以用于任何序列,却总是返回一个列表:

 
 
  1. >>> sorted('Python')  
  2. ['P', 'h', 'n', 'o', 't', 'y'] 

如果想把一些元素按相反的顺序排列,可以先使用sort(或者sorted),然后再调用reverse方法,  或者也可以使用reverse参数,下一节将对此进行描述。

10. 高级排序

如果希望元素能按照特定的方式进行排序(而不是sort函数默认的方式,即根据Python的默认排序规则按升序排列元素,第5章内对此进行讲解),那么可以通过compare(x,y)的形式自定义比较函数。compare(x,y)函数会在x < y时返回负数,在x > y时返回正数,如果x = y则返回0(根据你的定义)。定义好该函数之后,就可以提供给sort方法作为参数了。内建函数cmp提供了比较函数的默认实现方式:

 
 
  1. >>> cmp(42, 32)  
  2. 1  
  3. >>> cmp(99, 100)  
  4. -1  
  5. >>> cmp(10, 10)  
  6. 0  
  7. >>> numbers = [5, 2, 9, 7]  
  8. >>> numbers.sort(cmp)  
  9. >>> numbers  
  10. [2, 5, 7, 9] 

sort方法有另外两个可选的参数--key和reverse。如果要使用它们,那么就要通过名字来指定(这叫做关键字参数,请参见第6章以了解更多的内容)。参数key与参数cmp类似--必须提供一个在排序过程中使用的函数。然而,该函数并不是直接用来确定对象的大小,而是为每个元素创建一个键,然后所有元素根据键来排序。因此,如果要根据元素的长度进行排序,那么可以使用len作为键函数:

 
 
  1. >>> x = ['aardvark', 'abalone', 'acme', 'add', 'aerate']  
  2. >>> x.sort(key=len)  
  3. >>> x  
  4. ['add', 'acme', 'aerate', 'abalone', 'aardvark'] 

另一个关键字参数reverse是简单的布尔值(True或者是False。第5章会讲述更详细的内容),用来指明列表是否要进行反向排序。

 
 
  1. >>> x = [4, 6, 2, 1, 7, 9]  
  2. >>> x.sort(reverse=True)  
  3. >>> x  
  4. [9, 7, 6, 4, 2, 1]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值