Python基础数据类型(list,tuple,dict,set)


作者Lou Xiao创建时间2020-05-03 11:13:00更新时间2020-05-09 17:22:00

本节课介绍

本节课介绍常用的集合(collections):list、tuple、set、dict。

  • collections就是容纳(管理)一组元素的容器,不仅能方便地解决问题,还具有良好的性能,用好collections能够编写性能更好、功能更强的程序;
  • collections是Python的重要基础知识点。
  • 更多强大的collections 👉 [collections]

预备知识点

❶ Python:一切都是object。

❷ object的immutable属性 👉 [immutable]

An object with a fixed value. immutable(不可变)和mutable(可变)

  • immutable的类型:
    • int、 str、 None、 bool、
    • tuple(嵌套的元素全部都是immutable)
  • mutable的类型:
    list、 set、 dict

❸ object的hashable属性 👉 [hashable]

An object is hashable if it has a hash value which never changes during its lifetime
and can be compared to other objects
Python的内置的immutable类型都是hashable

  • hashable的类型:

    • int、 str、 None、 bool;
    • tuple(嵌套的元素全部都是hashable);
    • 默认情况下,由用户定义的Class的object;
  • not hashable的类型:

    • list
    • set
    • dict

list、tuple、set、dict通用方法

方法说明
len()查看collection元素个数
x in collection判断collection是否包含元素x
对于dict:检查是否包含key==x
collection[index]获取位置index上的元素;set不支持
迭代(遍历)for x in collection:print(x)
for key in dict.keys():print(key)
for val in dict.values():print(val)
for key, val in dict.items():print(key,val)

list(列表) 👉 [list]

list就是容纳一组有序的元素(object)的容器。类似于其他语言的数组Array

  • 特点
    • list是mutable
    • 元素类型是任何类型
    • 元素按照顺序存放

❶ 创建list

1.双击鼠标左键复制此行;2.单击复制所有代码。
                                
                                    
1 # 1 使用符号[]
2 a = []
3 # 2
4 b = [1, 2, 3]
5 # 3 Using a list comprehension
6 c = [x for x in b]
7 # 4 list()
8 d = list(b)
9 # 5 混合模式
10 e = ["a", 1, [1, 2, 3]]

❷ 增删改查

1.双击鼠标左键复制此行;2.单击复制所有代码。
                                
                                    
1 # 增
2 a = [1, 2, 3]
3 a.append(5)
4 print(a)
5 a.insert(0, 99)
6 print(a)
7 # 删
8 a = [1, 2, 3]
9 a.pop()
10 del a[0]
11 # 改
12 a = [1, 2, 3]
13 a[1] = "123"
14 print(a)
15 # 查
16 print(a[2])
1.双击鼠标左键复制此行;2.单击复制所有代码。
                                
                                    
1 [1, 2, 3, 5]
2 [99, 1, 2, 3, 5]
3 [1, '123', 3]
4 3

❸ 索引(下标)

1.双击鼠标左键复制此行;2.单击复制所有代码。
                                
                                    
1 #索引 0 1 2 3 4 5 6 7 8
2 #索引-9 -8 -7 -6 -5 -4 -3 -2 -1
3 a = [1, 2, 3, 4, 5, 6, 7, 8, 9]
4 ## 1
5 print(a[0])
6 print(a[-1])
7 ## 2 [2,4) 从2到4(不包括4),步长1
8 print(a[2:4])
9 ## 3 [2,8) 从2到8(不包括8),步长2
10 print(a[2:8:2])
1.双击鼠标左键复制此行;2.单击复制所有代码。
                                
                                    
1 1
2 9
3 [3, 4]
4 [3, 5, 7]

❹ 嵌套

1.双击鼠标左键复制此行;2.单击复制所有代码。
                                
                                    
1 a = [1, 2, 3]
2 b = [4, 5, 6]
3 c = [a, b]
4 print(c)
5 # 修改 a 之后
6 a.append(10)
7 print(c)
1.双击鼠标左键复制此行;2.单击复制所有代码。
                                
                                    
1 [[1, 2, 3], [4, 5, 6]]
2 [[1, 2, 3, 10], [4, 5, 6]]

❺ 遍历

1.双击鼠标左键复制此行;2.单击复制所有代码。
                                
                                    
1 a = [1, 2, 3, 4, 5]
2 for n in a:
3 print(n)
1.双击鼠标左键复制此行;2.单击复制所有代码。
                                
                                    
1 1
2 2
3 3
4 4
5 5

元组(tuple) 👉 [tuple]

tuple 是不可变版本(immutable)的list

  • 特点
    • tuple是immutable
    • 元素类型是任意类型
    • 元素按照顺序存放

❶ 创建

1.双击鼠标左键复制此行;2.单击复制所有代码。
                                
                                    
1 # 1 使用符号()
2 a = (1) # \(wrong)不是元组
3 print(type(a), a)
4 a = (1,) # \(correct)
5 print(type(a), a)
6 a = (1,2,3)
7 print(type(a), a)
8 a = 1, 2, 3
9 print(type(a), a)
10 # 2 使用tuple()
11 a = tuple([1,2,3])
12 print(type(a), a)

❷ 拆分(解构)

1.双击鼠标左键复制此行;2.单击复制所有代码。
                                
                                    
1 score = (1, 2, 3, 4)
2 a, b, c, d = score
3 print(a, b, c, d)
4 # list同样适用
5 score = [1, 2, 3, 4]
6 a, b, c, d = score
7 print(a, b, c, d)
8 # 应用举例(交换数字)
9 a = 1
10 b = 2
11 a, b = b, a
12 print(a, b)

❸ list、tuple嵌套

1.双击鼠标左键复制此行;2.单击复制所有代码。
                                
                                    
1 a = [
2 (1, 2, [3, 4, (5, 6)])
3 ]
4 print(a)
1.双击鼠标左键复制此行;2.单击复制所有代码。
                                
                                    
1 [(1, 2, [3, 4, (5, 6)])]

❹ 遍历

与list类似

1.双击鼠标左键复制此行;2.单击复制所有代码。
                                
                                    
1 a = (1, 2, 3, 4, 5)
2 for n in a:
3 print(n)

set(集合) 👉 [Set]

set 类似于数学概念上的集合
A set object is an unordered collection of distinct hashable objects.

  • 特点:
    • set是mutable
    • 元素是hashable
    • 元素是唯一的(自动去重)
    • 元素存放是无顺序

❶ 创建方法

1.双击鼠标左键复制此行;2.单击复制所有代码。
                                
                                    
1 # 1 使用{}
2 a = {} # 错误!不是set,而是 dict
3 a = {1, 2, 3} # 正确!
4 print(a)
5 # 2 使用set()
6 a = set()
7 a = set([1, 2, 3, 3, 4])
8 a = set((1, 2, 3, 3, 4))
9 print(a)
1.双击鼠标左键复制此行;2.单击复制所有代码。
                                
                                    
1 {1, 2, 3}
2 {1, 2, 3, 4}

❷ 运算

运算函数示例
大小len()len(set([1,2,3])) AlBeRt63EiNsTeIn 3
包含in2 in set([1,2,3]) AlBeRt63EiNsTeIn True
5 in set([1,2,3]) AlBeRt63EiNsTeIn False
交集&set((1, 2, 3)) & set((3, 4, 5)) AlBeRt63EiNsTeIn {3}
并集|set((1, 2, 3)) | set((3, 4, 5)) AlBeRt63EiNsTeIn {1, 2, 3, 4, 5}
差集-set((1, 2, 3)) - set((3, 4, 5)) AlBeRt63EiNsTeIn {1, 2}
symmetric_difference^set((1, 2, 3)) ^ set((3, 4, 5)) AlBeRt63EiNsTeIn {1, 2, 4, 5}

dict(字典) 👉 [dict]

dict 顾名思义,查找数据就像查字典一样,根据词(key) 找到 词义解释(value)
字典就是一个 (key, value) 的组合。
类似于其它编程语言的mapHashMap

  • 特点:
    • dict是mutable
    • key必须是hashable
    • key必须唯一(自动去重)
    • key存放是无顺序
    • value没有任何约束

❶ 创建字典 👉 [Python文档]

1.双击鼠标左键复制此行;2.单击复制所有代码。
                                
                                    
1 # 1 使用{}
2 d = {
3 1: "Ha Ha",
4 "ha": 'happy',
5 (5, 6, 7): 5 + 6 + 7,
6 }
7 print(d)
8 # 2 使用dict()
9 d = dict(one=1, two=2, three=3)
10 print(d)
11 d = dict((
12 (1, "Ha Ha"),
13 ("ha", "happy"),
14 ((5, 6, 7), 5 + 6 + 7),
15 ))
16 print(d)
17 # 3 复杂的示例
18 d = {
19 None: 'None',
20 True: 'True',
21 False: 'False',
22 'name': 'ming',
23 'age': 1.5,
24 'favorite': ['running', 'ping-pong', 'singing'],
25 'others': {
26 'address': ['Chao Yang', 'Beijing', 'China'],
27 },
28 (1, 2, 3): [5, 6, 7],
29 }
30 print(d)

演示结果

1.双击鼠标左键复制此行;2.单击复制所有代码。
                                
                                    
1 {1: 'Ha Ha', 'ha': 'happy', (5, 6, 7): 18}
2 {'one': 1, 'two': 2, 'three': 3}
3 {1: 'Ha Ha', 'ha': 'happy', (5, 6, 7): 18}
4 {None: 'None', True: 'True', False: 'False', 'name': 'ming', 'age': 1.5, 'favorite': ['running', 'ping-pong', 'singing'], 'others': {'address': ['Chao Yang', 'Beijing', 'China']}, (1, 2, 3): [5, 6, 7]}

❷ CRUD(增删改查)

1.双击鼠标左键复制此行;2.单击复制所有代码。
                                
                                    
1 # 1 增
2 d = {"one": 1, "two": 2, "three": 3}
3 d["four"] = 4
4 print(d)
5 # 2 删
6 d = {"one": 1, "two": 2, "three": 3}
7 del d["two"]
8 print(d)
9 # 3 改
10 d = {"one": 1, "two": 2, "three": 3}
11 d["one"] = 5
12 print(d)
13 d = {"one": 1, "two": 2, "three": 3}
14 e = {"one": 8, "two": 9, "six": 3}
15 d.update(e)
16 print(d)
17 # 4 查
18 d = {"one": 1, "two": 2, "three": 3}
19 print(d["one"])
20 print(d.get("five", 99))
1.双击鼠标左键复制此行;2.单击复制所有代码。
                                
                                    
1 {'one': 1, 'two': 2, 'three': 3, 'four': 4}
2 {'one': 1, 'three': 3}
3 {'one': 5, 'two': 2, 'three': 3}
4 {'one': 8, 'two': 9, 'three': 3, 'six': 3}
5 1
6 99

❸ 遍历

1.双击鼠标左键复制此行;2.单击复制所有代码。
                                
                                    
1 d = {"one": 1, "two": 2, "three": 3}
2 for k, v in d.items():
3 print(k, v)
1.双击鼠标左键复制此行;2.单击复制所有代码。
                                
                                    
1 one 1
2 two 2
3 three 3

collections 的性能优劣 👉 [TimeComplexity]

time-complexity (aka "Big O" or "Big Oh") of various operations in current CPython

时间复杂描述了操作(operation)的时间成本O 与 collections的大小n 之间的关系。即On的函数。
O(1) 常亮,性能最好; O($ n^3 $) 性能最差; O数字越小,性能越好。

❶ list

operation平均情况(好+坏)最坏情况说明
len()O(1)
增删尾部数据O(1)O(1)推荐,在list尾部进行增删
增删非尾部数据O(n)O(n)不推荐这样做,会导致该位置后边的元素都要移动一次
sortO(n log n)O(n log n)不好不坏,唯一选择
x in sO(n)在list中查找某数据,最好用set替换list
min(s), max(s)O(n)

❷ set

operation平均情况(好+坏)最坏情况说明
len()O(1)
增删数据O(1)O(1)
x in sO(1)
min(s), max(s)?

❸ dict

operation平均情况(好+坏)最坏情况说明
len()O(1)
x in sO(1)O(n)涉及到key的查找,一般可以认为是O(1)
Get ItemO(1)O(n)涉及到key的查找,一般可以认为是O(1)
Set ItemO(1)O(n)涉及到key的查找,一般可以认为是O(1)
Del ItemO(1)O(n)涉及到key的查找,一般可以认为是O(1)
CopyO(n)O(n)
IterationO(n)O(n)遍历
文章目录