--- title: List and Tuple 1 fid: 20240929-171327 tags: list, tuple --- (List-and-Tuple)= # List and Tuple Tutorial 1 **难度**: 1 **时长**: 45 min --- ## List 与 Tuple 的基本概念 List 与 **序列** 1. **序列** 是一种复合数据类型,由一组成员排序构成,如 `[1,2,3,4]` , `'China'`; 2. 序列包含 List 和 Tuple 两种主要类型; (还包含 str, bytes, bytearray)[^sequence-datatype] 3. 其元素有编号(下标),如 `a[2]`,即位置或索引;编号从0起, `a[0]` 是其首成员; 可以用负数索引,如 `a[-1]`。 **问** :如果 `a=[1,2,3,4]`, 那么 `a[1]`, `a[-1]` 的值分别是什么? [^first-or-zeroth-element] 4. List 的每个成员的类型可以不同,如: `student = ['Tom', 42]`。 不过为了简单,一般列表中的所有成员类型相同 [^sequence-datatype]: 这些序列类型都支持索引和切片操作,并且可以通过内置的函数和方法来操作序列中的元素。例如,你可以使用 len() 函数来获取序列的长度,使用 in 关键字来检查某个元素是否存在于序列中,以及使用 + 运算符来连接序列等。 [^first-or-zeroth-element]: `a[0]` 应该是被称为`a`的第 0 个元素,还是第 1 个成员? 日常交流时,人们更习惯从第 1 个开始计数。 --- ![Python List 图解](images/python-list-of-lists.svg) (difference-list-tuple)= ### tuple 和 list 的联系与区别 **联系:** tuple 和 list都是序列类型 ```python edward1 = ['Edward Gumby', 42] edward2 = ('Edward Gumby', 42) ``` edward1 和 edward2 有何相同之处与不同之处? **区别:** 1. List可以修改,只读的Tuple (元组)不可修改; 2. 能用 Tuple 的地方,就能用 List, List几乎在所有情况下可代替 tuple,但 List 开销更大一些 3. Tuple一般用来做函数返回值 **注意:** 1. 包含一个元素的 tuple 和 list 有点形式上的区别。如:在 A. `[42,]`, B. `(42,)`, C. `[42]` 和 D. `(42)` 中,哪些能正确表示 **"只有一个元素的序列"** ? 2. 可带逗号结尾的语法规则有利于注释掉其中的成员不影响语法正确性 ```python students = [ '张三', '李四', '王五', ] ``` ## 基础通用序列操作 ![List 下标](images/python-slice-list.png) 1. 索引 `x[5]`, 切片 `s[2:4]`, `s[::]`, `s[::-1]` 2. 相加 `x+s`;怎样相乘 ? 3. 成员(包含)检查 `in` 4. 支持迭代 ( `for ... in`) 5. 支持内置方法/函数,如: 求长度、最大、最小元素、排序 `sort()` 等 ### 切片 如果 `x=[1,2,3,4,5]`,如何取出其中的部分成员,得到下面的结果: 1. `[1,2,3]`, 2. `[4,5]`, 3. `[5,4,3,2,1]`, 4. `[1,3,5]`, 5. `[5,3,1]` ### 序列加法 执行下面的代码结果会是什么? 请根据结果总结序列加法的规则 ``` {.pyhton} >>> [1, 2, 3] + [4, 5, 6] >>> 'Hello,' + 'world!' >>> [1, 2, 3] + 'world!' >>> [1, 2, 3] + (4, 5, 6) >>> (1, 2, 3) + (4, 5, 6) >>> [1, 2, 3] + ["4", "5", "6"] ``` ### 序列乘法 执行下面的代码结果会是什么? 用一句话总结序列加法的规则 ```python >>> [42] * 10 >>> 'python' * 5 >>> []+[] >>> []*5 >>> [None] * 10 ``` ### [练习1]:序列切片 **题目**:给定列表 `data = [10, 20, 30, 40, 50, 60, 70, 80, 90, 100]` 1. 获取前3个元素 2. 获取最后3个元素 3. 获取第3到第7个元素(包含第3,不包含第7) 4. 获取所有偶数位置的元素 5. 将列表反转 [答案] ``````{only} ```python data = [10, 20, 30, 40, 50, 60, 70, 80, 90, 100] print(data[:3]) # [10, 20, 30] print(data[-3:]) # [80, 90, 100] print(data[3:7]) # [40, 50, 60, 70] print(data[::2]) # [10, 30, 50, 70, 90] print(data[::-1]) # [100, 90, 80, 70, 60, 50, 40, 30, 20, 10] ``` `````` ## 案例 1: 用户管理 目标: 通过此练习直接练习使用 List 的各种方法 如果有用户输入 `username='scuec', password='2345'`,以及用户注册数据库 `database`。 ```python database = [['albert', '1234'], ['dilbert', '4242'], ['smith', '7524'], ['jones', '9843']] ['jones', '9843'] in database ``` 使用 Python List 操作,完成以下功能: 1. 怎么检验用户是否是合法用户? `in` 2. 修改用户名 3. 学生完成:修改密码 4. 新用户注册 `append` 5. 用户注销: `del`, `remove` 6. 由用户查密码 7. 用户排序: `sort` 8. 密码排序 9. 列出全部用户: `for ... in ` 10. 限制用户修改密码: `tuple` 11. 密码存储加密 (hash) ## List 赋值修改 怎样修改列表的部分成员值? - `a = [1,2,3,4,5,6]` , 将 `a` 的第1个,最后一个元素置0; - 将 `a` 的最后一半置0 - 将 `a` 的偶数位置的元素置0 - 将 `a` 的奇数位置元素的值 `*10` (也可以用 for in 语法) ```python a[i] = ... # 修改1个成员 a[i:j] = ... # 修改多个成员 ``` ### 索引与切片赋值应用 1. 要将 `["p", "e", "r", "l"]` 修改成 `["p", "e", "a", "r"]`,下面的4个方法中哪些正确,你你喜欢哪种方法? ```python #// 1 var = ["p", "e", "r", "l"] var[-1] = "r" var[-2] = "a" #// 2 var = ["p", "e", "r", "l"] var = var[:2] + ["r", "l"] #// 3 var = ["p", "e", "r", "l"] var[3:] = ["a", "r"] #// 4 var = ["p", "e", "r", "l"] var = list("".join(var).replace("rl", "ar")) ``` 2. 将 `[1, 5]` 修改成 `[1, 2, 3, 4, 5]`,下面的方法中哪个方法可行? ```python # (1) a[1]=[2,3,4] # (2) a[1:1]=[2,3,4] ``` ### 字符串与 list 相互转换 ```python >>> alist = list('Hello') >>> ''.join(alist) ``` 练习: 将句子 `"He's a very naughty boy!"` 转成单词组成的 list ## 删除部分成员或全部 ### 删除一个成员 删除 `a :List` 的第2个元素,哪个正确? ```python >>> a = [1,2,3,4,5,6] >>> del a[2] #// 1 >>> a[2:3] = [] #// 2 >>> a[2] = [] #// 3 ``` ### 删除全部成员 删除 `a :List` 的全部元素,哪个正确? 方法(1)列表切片赋值为空 和 方法(2)列表赋值为空有何区别? 用 `id()` 来探索 ```python >>> a = [1,2,3,4,5,6] >>> a[:]=[] #(1) >>> a=[] #(2) ```