Python基础(三) | Python的组合数据类型
第三章 组合数据类型
⭐本专栏旨在对Python的基础语法进行详解,精炼地总结语法中的重点,详解难点,面向零基础及入门的学习者,通过专栏的学习可以熟练掌握python编程,同时为后续的数据分析,机器学习及深度学习的代码能力打下坚实的基础。
🔥本文已收录于Python基础系列专栏: Python基础系列教程 免费订阅,持续更新。
文章目录
3.1 列表
3.1.1 列表的表达
ls = ["Python", 1989, True, {"version": 3.7}]
ls
['Python', 1989, True, {'version': 3.7}]
字符串转列表
list("欢迎订阅本专栏")
['欢', '迎', '订', '阅', '本', '专', '栏']
元组转列表
list(("我", "们", "很", "像"))
['我', '们', '很', '像']
集合转列表
list({"李雷", "韩梅梅", "Jim", "Green"})
['Green', 'Jim', '李雷', '韩梅梅']
特殊的range()
for i in [0, 1, 2, 3, 4, 5]:
print(i)
0
1
2
3
4
5
for i in range(6):
print(i)
0
1
2
3
4
5
如果起始数字缺省,默认为0
必须包含中止数字,但是注意中止的数字取不到
数字间隔缺省,默认为1
for i in range(1, 11, 2):
print(i)
1
3
5
7
9
list(range(1, 11, 2))
[1, 3, 5, 7, 9]
3.1.2 列表的性质
ls = [1, 2, 3, 4, 5]
len(ls)
5
变量名[位置编号]
正向索引从0开始
反向索引从-1开始
cars = ["BYD", "BMW", "AUDI", "TOYOTA"]
print(cars[0])
print(cars[-4])
BYD
BYD
变量名[开始位置:结束位置:切片间隔]
cars = ["BYD", "BMW", "AUDI", "TOYOTA"]
print(cars[:3]) # 前三个元素,开始位置缺省,默认为0;切片间隔缺省,默认为1
['BYD', 'BMW', 'AUDI']
print(cars[1:4:2]) # 第二个到第四个元素 前后索引差为2
['BMW', 'TOYOTA']
print(cars[:]) # 获取整个列表,结束位置缺省,默认取值到最后
['BYD', 'BMW', 'AUDI', 'TOYOTA']
print(cars[-4:-2]) # 获取前两个元素
['BYD', 'BMW']
cars = ["BYD", "BMW", "AUDI", "TOYOTA"]
print(cars[:-4:-1]) # 开始位置缺省,默认为-1
print(cars[::-1]) # 获得反向列表
['TOYOTA', 'AUDI', 'BMW']
['TOYOTA', 'AUDI', 'BMW', 'BYD']
3.1.3 列表的操作符
a = [1, 2]
b = [3, 4]
a+b # 该用法用的不多
[1, 2, 3, 4]
初始化列表的一种方式
[0]*10
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
3.1.4 列表的操作方法
1、增加元素
languages = ["Python", "C++", "R"]
languages.append("Java")
languages
['Python', 'C++', 'R', 'Java']
在位置编号相应元素前插入待增元素
languages.insert(1, "C")
languages
['Python', 'C', 'C++', 'R', 'Java']
append 将列表2整体作为一个元素添加到列表1中
languages.append(["Ruby", "PHP"])
languages
['Python', 'C', 'C++', 'R', 'Java', ['Ruby', 'PHP']]
extend 将待列表2内的元素逐个添加到列表1中,当然也可以采用加法实现。
languages = ['Python', 'C', 'C++', 'R', 'Java']
languages.extend(["Ruby", "PHP"])
languages
['Python', 'C', 'C++', 'R', 'Java', 'Ruby', 'PHP']
2、删除元素
languages = ['Python', 'C', 'C++', 'R', 'Java']
languages.pop(1)
languages
['Python', 'C++', 'R', 'Java']
languages.pop()
languages
['Python', 'C++', 'R']
languages = ['Python', 'C', 'R', 'C', 'Java']
languages.remove("C")
languages
['Python', 'R', 'C', 'Java']
languages = ['Python', 'C', 'R', 'C', 'Java']
while "C" in languages:
languages.remove("C")
languages
['Python', 'R', 'Java']
3、查找元素
languages = ['Python', 'C', 'R','Java']
idx = languages.index("R")
idx
2
4、修改元素
languages = ['Python', 'C', 'R','Java']
languages[1] = "C++"
languages
['Python', 'C++', 'R', 'Java']
5、列表的复制
languages = ['Python', 'C', 'R','Java']
languages_2 = languages
print(languages_2)
['Python', 'C', 'R', 'Java']
languages.pop()
print(languages)
print(languages_2)
['Python', 'C', 'R']
['Python', 'C', 'R']
当内容中也有列表这种可变的情况时,这时浅拷贝可能出问题,应该采用深拷贝。
languages = ['Python', 'C', 'R','Java']
languages_2 = languages.copy()
languages.pop()
print(languages)
print(languages_2)
['Python', 'C', 'R']
['Python', 'C', 'R', 'Java']
languages = ['Python', 'C', 'R','Java']
languages_3 = languages[:]
languages.pop()
print(languages)
print(languages_3)
['Python', 'C', 'R']
['Python', 'C', 'R', 'Java']
6、列表的排序
ls = [2, 5, 2, 8, 19, 3, 7]
ls.sort()
ls
[2, 2, 3, 5, 7, 8, 19]
ls.sort(reverse = True)
ls
[19, 8, 7, 5, 3, 2, 2]
ls = [2, 5, 2, 8, 19, 3, 7]
ls_2 = sorted(ls)
print(ls)
print(ls_2)
[2, 5, 2, 8, 19, 3, 7]
[19, 8, 7, 5, 3, 2, 2]
sorted(ls, reverse = True)
[19, 8, 7, 5, 3, 2, 2]
7、列表的翻转
ls = [1, 2, 3, 4, 5]
print(ls[::-1])
ls
[5, 4, 3, 2, 1]
[1, 2, 3, 4, 5]
ls.reverse()
ls
[5, 4, 3, 2, 1]
8、使用for循环对列表进行遍历
ls = [1, 2, 3, 4, 5]
for i in ls:
print(i)
1
2
3
4
5
3.2 元组
3.2.1 元组的表达
通俗的讲,可以将元组视作“不可变的列表”
names = ("Peter", "Pual", "Mary")
3.2.2 元组的操作
3.2.3 元组的常见用处
打包与解包
def f1(x): # 返回x的平方和立方
return x**2, x**3 # 实现打包返回
print(f1(3))
print(type(f1(3))) # 元组类型
(9, 27)
<class 'tuple'>
a, b = f1(3) # 实现解包赋值
print(a)
print(b)
9
27
numbers = [201901, 201902, 201903]
name = ["小明", "小红", "小强"]
list(zip(numbers,name))
[(201901, '小明'), (201902, '小红'), (201903, '小强')]
for number,name in zip(numbers,name): # 每次取到一个元组,立刻进行解包赋值
print(number, name)
201901 小明
201902 小红
201903 小强
3.3 字典
3.3.1 字典的表达
students = {201901: '小明', 201902: '小红', 201903: '小强'}
students
字典键的要求
如果重复,前面的键就被覆盖了
students = {201901: '小明', 201901: '小红', 201903: '小强'}
students
{201901: '小红', 201903: '小强'}
2、字典的键必须是不可变类型,如果键可变,就找不到对应存储的值了
不可变类型:数字、字符串、元组。 一旦确定,它自己就是它自己,变了就不是它了。
可变类型:列表、字典、集合。 一旦确定,还可以随意增删改。因此这三个类型不能作为字典的键。
d1 = {1: 3}
d2 = {"s": 3}
d3 = {(1,2,3): 3}
上面没有报错,说明是合法的。
d = {[1, 2]: 3}
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-68-bf7f06622b3f> in <module>
----> 1 d = {[1, 2]: 3}
TypeError: unhashable type: 'list'
d = {{1:2}: 3}
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-69-188e5512b5fe> in <module>
----> 1 d = {{1:2}: 3}
TypeError: unhashable type: 'dict'
d = {{1, 2}: 3}
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-70-c2dfafc1018a> in <module>
----> 1 d = {{1, 2}: 3}
TypeError: unhashable type: 'set'
3.3.2 字典的性质
students = {201901: '小明', 201902: '小红', 201903: '小强'}
len(students)
3
通过 字典[键] 的形式来获取对应的值
students = {201901: '小明', 201902: '小红', 201903: '小强'}
students[201902]
'小红'
3.3.3 字典的操作方法
1、增加键值对
students = {201901: '小明', 201902: '小红', 201903: '小强'}
students[201904] = "小雪"
students
{201901: '小明', 201902: '小红', 201903: '小强', 201904: '小雪'}
2、删除键值对
students = {201901: '小明', 201902: '小红', 201903: '小强'}
del students[201903]
students
{201901: '小明', 201902: '小红'}
students = {201901: '小明', 201902: '小红', 201903: '小强'}
value = students.pop(201903) # 删除键值对,同时获得删除键值对的值
print(value)
print(students)
小强
{201901: '小明', 201902: '小红'}
students = {201901: '小明', 201902: '小红', 201903: '小强'}
key, value = students.popitem()
print(key, value)
print(students)
201903 小强
{201901: '小明', 201902: '小红'}
3、修改值
students = {201901: '小明', 201902: '小红', 201903: '小强'}
students[201902] = "小雪"
students
{201901: '小明', 201902: '小雪', 201903: '小强'}
4、d.get( )方法
d.get(key,default) 从字典d中获取键key对应的值,如果没有这个键,则返回default
s = "牛奶奶找刘奶奶买牛奶"
d = {}
print(d)
for i in s:
d[i] = d.get(i, 0)+1 # 如果该字符第一次出现,则返回default 0 ,然后+1统计。如果之前就有i这个键,则返回该 key i 所对应的值。
print(d)
# print(d)
{}
{'牛': 1}
{'牛': 1, '奶': 1}
{'牛': 1, '奶': 2}
{'牛': 1, '奶': 2, '找': 1}
{'牛': 1, '奶': 2, '找': 1, '刘': 1}
{'牛': 1, '奶': 3, '找': 1, '刘': 1}
{'牛': 1, '奶': 4, '找': 1, '刘': 1}
{'牛': 1, '奶': 4, '找': 1, '刘': 1, '买': 1}
{'牛': 2, '奶': 4, '找': 1, '刘': 1, '买': 1}
{'牛': 2, '奶': 5, '找': 1, '刘': 1, '买': 1}
5、d.keys( ) d.values( )方法
把所有的key,value 单独拿出来。
students = {201901: '小明', 201902: '小红', 201903: '小强'}
print(list(students.keys()))
print(list(students.values()))
[201901, 201902, 201903]
['小明', '小红', '小强']
6、d.items( )方法及字典的遍历
print(list(students.items()))
for k, v in students.items():#进行解包
print(k, v)
[(201901, '小明'), (201902, '小红'), (201903, '小强')]
201901 小明
201902 小红
201903 小强
3.4 集合
3.4.1 集合的表达
students = {"小明", "小红", "小强", "小明"} #可用于去重
students
{'小强', '小明', '小红'}
3.4.2 集合的运算
Chinese_A = {"刘德华", "张学友", "张曼玉", "钟楚红", "古天乐", "林青霞"}
Chinese_A
{'刘德华', '古天乐', '张学友', '张曼玉', '林青霞', '钟楚红'}
Math_A = {"林青霞", "郭富城", "王祖贤", "刘德华", "张曼玉", "黎明"}
Math_A
{'刘德华', '张曼玉', '林青霞', '王祖贤', '郭富城', '黎明'}
Chinese_A & Math_A
{'刘德华', '张曼玉', '林青霞'}
Chinese_A | Math_A
{'刘德华', '古天乐', '张学友', '张曼玉', '林青霞', '王祖贤', '郭富城', '钟楚红', '黎明'}
Chinese_A ^ Math_A
{'古天乐', '张学友', '王祖贤', '郭富城', '钟楚红', '黎明'}
Chinese_A - Math_A
{'古天乐', '张学友', '钟楚红'}
Math_A - Chinese_A
{'王祖贤', '郭富城', '黎明'}
3.4.3 集合的操作方法
stars = {"刘德华", "张学友", "张曼玉"}
stars.add("王祖贤")
stars
{'刘德华', '张学友', '张曼玉', '王祖贤'}
stars.remove("王祖贤")
stars
{'刘德华', '张学友', '张曼玉'}
len(stars)
3
for star in stars:
print(star)
张学友
张曼玉
刘德华