串列 ( 常用方法 )
在“串列 list”文章里已经介绍了串列的建立、新增、修改...等功能,这篇教学会介绍串列的查询、排序、复制...等其他相关的操作方法。
本篇使用的 Python 版本为 3.7.12,所有范例可使用 Google Colab 实作,不用安装任何软件 ( 参考:使用 Google Colab )
常用操作方法
| 方法 | 说明 |
|---|---|
| sort()、 sorted() | 排序 |
| slice()、reverse() | 反转 |
| slice、copy()、list()、deepcopy() | 复制 |
| index() | 取得项目 offset |
| len() | 取得串列长度 |
| count() | 计算内容出现次数 |
| join() | 结合串列内容 |
| in | 检查内容是否存在 |
| ==、!=、>、< | 比较串列 |
| * | 重复项目 |
sort()、 sorted()
Python 提供 sort() 和 sorted() 两种串列的函数,函数内包含 key 和 reverse 参数 ( 可都不填 ),key 则表示进行比较的元素,reverse 不填则使用默认 False,进行升序排序 ( 小到大 ),如果参数为 True 进行降序排序 ( 大到小 ),如果排序的是字串,以字母的顺序进行排序。
sort()
sort() 函数使用后,会直接将原本的串列项目进行排序,因此“会改变”原始的串列。
a = [0,3,2,1,4,9,6,8,7,5] a.sort() print(a) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] a.sort(reverse=True) print(a) # [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]sorted()
sorted() 函数使用后,会产生一个排序过后的新串列,因此“不会改变”原始的串列。
a = [0,3,2,1,4,9,6,8,7,5] b = sorted(a) c = sorted(a, reverse=True) print(a) # [0, 3, 2, 1, 4, 9, 6, 8, 7, 5] print(b) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] print(c) # [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]如果序列的内容也是序列,排序时可以透过 key 参数,指定对应的项目进行排序,下面的范例使用匿名函数 lambda ( 参考 匿名函数 lambda ),针对每个项目的第二个子项目进行排序 ( 如果没有设定 key 参数,默认都以第一个项目进行排序 )。
a = [[1,2,3],[9,8,7],[2,4,6],[3,1,9]] b = sorted(a) c = sorted(a, key = lambda s: s[1]) print(a) # [[1, 2, 3], [9, 8, 7], [2, 4, 6], [3, 1, 9]] print(b) # [[1, 2, 3], [2, 4, 6], [3, 1, 9], [9, 8, 7]] 使用第一個項目 1,2,3,9 排序 print(c) # [[3, 1, 9], [1, 2, 3], [2, 4, 6], [9, 8, 7]] 使用第二個項目 1,2,4,8 排序
反转串列
Python 提供了两种反转串列的方法:
slice
使用 slice 反转串列方法不会改变原始串列,会产生一个新的串列,在产生新串列时使用“
[::-1]”,就能反转串列内容。a = [0,1,2,3,4,5] b = a[::-1] print(a) # [0, 1, 2, 3, 4, 5] print(b) # [5, 4, 3, 2, 1, 0]reverse()
使用 reverse() 函数可以反转串列,但反转之后,会改变原始串列。
a = [0,1,2,3,4,5] a.reverse() print(a) # [5, 4, 3, 2, 1, 0]
复制串列
Python 提供四种复制串列的方法:
slice、copy()、list()
slice、copy()、list() 三种方式都可以快速复制一个新的串列。
a = [0,1,2,3,4,5] b = a[:] c = a.copy() d = list(a) print(a) # [0, 1, 2, 3, 4, 5] print(b) # [0, 1, 2, 3, 4, 5] print(c) # [0, 1, 2, 3, 4, 5] print(d) # [0, 1, 2, 3, 4, 5]deepcopy()
上述的三种方式只能针对“项目内容不会发生变化”的串列,如果项目的“深层内容”会发生变化,就会出现奇怪的现象,举例来说,下方的程序码执行后,当 a 改变时理应不该影响到 b、c、d 这三个新串列,但执行结果却发现 b、c、d 的内容也跟着改变了。
a = [0,1,2,3,4,[100,200]] b = a[:] c = a.copy() d = list(a) a[-1][0]=999 print(a) # [0, 1, 2, 3, 4, [999, 200]] print(b) # [0, 1, 2, 3, 4, [999, 200]] print(c) # [0, 1, 2, 3, 4, [999, 200]] print(d) # [0, 1, 2, 3, 4, [999, 200]]如果要解决这个问题,就必须要 import copy() 模组,使用 deepcopy() 进行深度复制,就能产生一个完全独立的新串列。
import copy a = [0,1,2,3,4,[100,200]] b = a[:] c = a.copy() d = list(a) e = copy.deepcopy(a) a[-1][0]=999 print(a) # [0, 1, 2, 3, 4, [999, 200]] print(b) # [0, 1, 2, 3, 4, [999, 200]] print(c) # [0, 1, 2, 3, 4, [999, 200]] print(d) # [0, 1, 2, 3, 4, [999, 200]] print(e) # [0, 1, 2, 3, 4, [100, 200]] 使用 deepcopy 的沒有被改變
index() 取得项目 offset
index() 函数可以取得串列中某个内容的 offset,如果有多个同样内容的项目,以第一个找到的为主。
a = ['apple','banana','banana','orange']
print(a.index('banana')) # 1
len() 取得串列长度
len() 函数可以取得串列的长度 ( 里面有几个项目 )。
a = ['apple','banana','banana','orange']
print(len(a)) # 4
count() 计算内容出现次数
count() 函数可以计算串列中,某些内容出现的次数。
a = ['apple','banana','banana','orange']
print(a.count('banana')) # 2
print(a.count('grap')) # 0
join() 结合串列内容
join() 函数可以将一个串列里面所有的项目,串连起来变成一个字串,使用时用一个要接起来的字串,链接要结合的每个项目。
a = ['hello world', 'I am oxxo', 'how are you?']
b = ', '.join(a) # 使用逗號「,」進行結合
print(b) # hello world, I am oxxo, how are you?
in 检查内容是否存在
透过“元素 in 串列”的方法,可以检查串列中是否存在某些内容,如果存在则回传 True,不存在则回传 False ( 使用“元素 not in 集合”可以判断不存在 )。
a = ['apple','banana','banana','orange']
print('orange' in a) # True
print('melon' in a) # False
比较串列
使用等号“==”、“!=”,可以比较两个串列是否相等,使用大于小于符号“<”、“<=”、“>=”、“>”,可以比较串列里头“同样位置”元素的编码是否相等,注意,串列的比较只能针对“同样型别”的数据,如果比较数值和字串的内容,就会发生错误。
a = [1,2,3,4]
b = [1,2,3,4,5]
c = [4,5,6]
print(a==b) # False
print(a>=b) # False
print(a>c) # False
print(a<c) # True
print(a<b) # True
print(a!=b) # True
使用 * 号重复项目
使用星号“*”可以重复串列的内容,使其变成一个新的串列。
a = ['apple','banana']
b = a*3
print(a) # ['apple', 'banana']
print(b) # ['apple', 'banana', 'apple', 'banana', 'apple', 'banana']
微信扫码关注
抖音扫码关注