Python

Python 知识量:10 - 41 - 150

7.4 列表的应用><

列表排序- 7.4.1 -

排序在列表的应用中很常见,可以使用函数sort()来实现列表元素的排序。与反转函数reverse()一样,sort()也是直接修改列表,不会对列表进行拷贝。

>>> ls=[11,65,2,63,8]
>>> ls.sort()
>>> ls
[2, 8, 11, 63, 65]

Python对序列的排序方式称为字典顺序,即字母顺序。基本原理是:首先按第一项对各元素进行排序,如果第一项相同,则按二项排序,以此类推。

函数sort()总是按升序排列元素,如果需要按降序排列,可以使用反转函数reverse()对sort()排序后的序列再反转一次。

函数sort()可以对元组进行排序,但列表元素必须全部是元组类型,不能混合其他类型。也可以对列表元素全部是列表的列表进行排序,同样不能混合其他类型。

>>> #下面对元组排序
>>> ls2=[(1,65),(2,56),(2,45),(0,89)]  
>>> ls2.sort()
>>> ls2
[(0, 89), (1, 65), (2, 45), (2, 56)]
>>> ls2.reverse()
>>> ls2
[(2, 56), (2, 45), (1, 65), (0, 89)]
>>> #下面对列表作为元素的列表进行排序
>>> ls2=[[1,65],[2,56],[2,45],[0,89]]  
>>> ls2.sort()
>>> ls2
[[0, 89], [1, 65], [2, 45], [2, 56]]
>>> ls2.reverse()
>>> ls2
[[2, 56], [2, 45], [1, 65], [0, 89]]
>>> #下面对混合的元组和整数类型排序,会出错。
>>> ls2=[2,89,(2,56),(2,45),12]  
>>> ls2.sort()
Traceback (most recent call last):
  File "<pyshell#38>", line 1, in <module>
    ls2.sort()
TypeError: '<' not supported between instances of 'tuple' and 'int'
>>> #下面对混合的列表和整数类型排序,会出错。
>>> ls2=[2,86,[2,56],[2,45],12]  
>>> ls2.sort()
Traceback (most recent call last):
  File "<pyshell#36>", line 1, in <module>
    ls2.sort()
TypeError: '<' not supported between instances of 'list' and 'int'

列表解析- 7.4.2 -

列表解析是Python提供的一种用于创建列表的特殊表示法。列表解析应用起来非常的简洁且易于理解,可以将复杂的任务用精妙简短的语局表达出来。例如:下面创建一个20以内的正偶数的列表。

>>> [n*2 for n in range(1,11)]
[2, 4, 6, 8, 10, 12, 14, 16, 18, 20]

如果采用常规方法需要使用循环语句,会比以上代码复杂的多。

可以利用列表解析来批量的修改列表中的每个值,例如:将列表中的单词全部变为大写。

>>> animals=['dog','cat','pig','bird']
>>> animals
['dog', 'cat', 'pig', 'bird']
>>> animals2=[letter.upper() for letter in animals]
>>> animals2
['DOG', 'CAT', 'PIG', 'BIRD']

列表解析与筛选- 7.4.3 -

列表解析在剔除不想要的列表元素方面非常有用,而且操作起来很方便和高效。

1、剔除负数。

>>> n=[2,-9,-65,78,56,7,12]
>>> n2=[m for m in n if m>0]
>>> n2
[2, 78, 56, 7, 12]

2、剔除元音字母。

>>> str='We like football.'
>>> str
'We like football.'
>>> str2=''.join([letter for letter in str if letter.lower() not in 'aeiou'])
>>> str2
'W lk ftbll.'

以上代码中,for letter in str用于从字符串str中逐个提取字母;letter.lower()用于将提取的字母修改为小写;not in 'aeiou'用于确保非元音字符才会保留。由于列表解析返回的是一个列表,因此使用函数join()将其拼接为字符串。

3、生成器表达式。

在以上代码中,如果舍弃列表解析中的方括号,传递给函数join()的表达式就是一个生成器表达式。

>>> str2=''.join(letter for letter in str if letter.lower() not in 'aeiou') 
>>> str2
'W lk ftbll.'
>>> str2=''.join(letter.upper() for letter in str if letter.lower() not in 'aeiou')
>>> str2
'W LK FTBLL.'

与列表解析相比,每当函数join()需要一个元素时,生成器表达式才计算并传递给它,直到循环完毕;而列表解析是一次性生成全部元素建立列表后直接传递给函数join()。