Python学习第二周总结
第二周主要学了python中几种常见的数据结构,分别是列表、元组、字符串、集合、字典重点就是怎么创建和使用这些数据结构,操作方法更是一定要掌握的。
一、列表
1.1 定义
列表是由一系元素按特定顺序构成的数据序列,这样就意味着定义一个列表类型的变量,可以保存多个数据,而且允许有重复的数据
1.2列表的创建
- 字面量语法
list1 = ['apple', 'orange', 'pear']
print(list1)
- 构造器语法
list2 = list(range(1, 10))
print(list2)
- 生成式(推导式)语法
list3 = [i ** 2 for i in range(1, 10)]
print(list3)
1.3列表的相关操作
-
[:] 表示从头到尾全部取完
-
[::n] 表示从头到尾,间隔为n依次取完
-
[m:n] 表示从m到n,但是取不到n
-
[::-1] 表示从尾到头倒着依次取完
-
append 表示从最后添加元素
items = ['banana', 'pear', 'apple'] items.append('blueberry') items.insert(1, 'strawberry') print(items)
-
pop() 删除对应下标位置的元素,不输入下标时默认删除末尾元素
-
clear() 表示清空列表里的所有元素
-
remove 从列表中删除指定元素,从左到右删除第一个,可以通过循环删除全部
items = ['banana', 'pear', 'strawberry', 'apple', 'blueberry'] items.pop() items.pop(2) items.remove('apple') print(items)
-
反转
这是直接用切片的方法从最后往前输出,得到反转的效果
items = ['banana', 'pear', 'apple'] print(items[::-1])
我们也可以用reverse来达到一样的效果
items = ['banana', 'pear', 'apple']
items.reverse()
print(items)
-
排序
sort()对列表进行排序,字符串会按照字母表排序,默认从小到大(升序)排序,即reverse = False, 而reverse = True会按照从大到小(降序)排序。
对于字符串类型的数字,按照首位的数字进行排序,如果相同就比较下一位。
items = ['banana', 'pear', 'apple']
items.sort() # 默认是False升序
print(items)
nums = ['1', '10', '234', '2', '35', '100']
nums.sort(key=int)
print(nums)
需要说明的是,上面列表的里的元素是字符串,而不是数字。如果只是sort()直接排序,得到的应该是[‘1’, ‘10’, ‘100’, ‘2’, ‘234’, ‘35’]。我们用了一个key=int让它把列表里的元素当成数字来排序。
二、元组
2.1定义
元组也是多个元素按照一定的顺序构成的序列。元组和列表的不同之处在于,元组是不可变类型,这就意味着元组类型的变量一旦定义,其中的元素不能再添加或删除,而且元素的值也不能进行修改。定义元组通常使用()
字面量语法,且元组类型支持的运算符跟列表是一样
一个元组中如果有两个元素,我们就称之为二元组;一个元组中如果五个元素,我们就称之为五元组。需要提醒大家注意的是,()
表示空元组,但是如果元组中只有一个元素,需要加上一个逗号,否则()
就不是代表元组的字面量语法,而是改变运算优先级的圆括号。下面用代码演示一下
nums = ('100',)
print(type(nums))
nums = ('100')
print(type(nums))
看,如果没有逗号,计算机认为我们输入的是字符串,而不是元组。所以不能忘记
2.2 元组的相关操作
fruits1 = ('apple', 'banana', 'grape',)
print(type(fruits1))
# 重复运算
print(fruits1 * 3)
# 成员运算
print('apple' in fruits1)
print('grape' not in fruits1)
fruits1 = ('apple', 'banana', 'grape',)
print(type(fruits1))
# 合并运算
fruits2 = ('pitaya', 'litchi')
fruits3 = fruits1 + fruits2
print(fruits3)
# 索引和切片
print(fruits3[4], fruits3[-1])
print(fruits3[1:4])
print(fruits3[1:4:2])
print(fruits3[::-1])
三、字符串
3.1 定义
所谓字符串,就是由零个或多个字符组成的有限序列,如果我们把单个或多个字符用单引号或者双引号包围起来,就可以表示一个字符串。字符串中的字符可以是特殊符号、英文字母、中文字符、日文的平假名或片假名、希腊字母、Emoji字符等。
3.2字符串的运算
Python为字符串类型提供了非常丰富的运算符,我们可以使用+
运算符来实现字符串的拼接,可以使用*
运算符来重复一个字符串的内容,可以使用in
和not in
来判断一个字符串是否包含另外一个字符串,我们也可以用[]
和[:]
运算符从字符串取出某个字符或某些字符。
a = 'hello,world'
# 获取字符串的长度
print(len(a))
# 循环遍历字符串每个字符
for i in range(len(a)):
print(a[i])
for i in a:
print(i)
# 重复运算
print(a * 5)
# 成员运算
print('or' in a)
print('ko' in a)
b = 'hello,World'
# 比较运算(比较字符串的内容)
print(a == b)
print(a != b)
c = 'goodbye,world'
print(b > c)
d = 'hello,everybody'
print(b >= d)
# 字符串的拼接
e = '!!!'
print(d + e)
f = ' goodbye'
print(d + e + f)
3.3大小写相关操作
a = 'i LOVE you'
# 转大写
print(a.upper())
# 转小写
print(a.lower())
# 首字母大写
print(a.capitalize())
# 每个单词首字母大写
print(a.title())
b = 'abc123'
# 判断字符串是不是数字
print(b.isdigit())
# 判断是不是字母
print(b.isalpha())
# 判断是不是字母和数字
print(b.isalnum())
# 判断是不是ASCII码字符
print(b.isascii())
c = '你好呀'
print(c.isascii())
print('-' * 5)
# 判断字符串是否用指定内容开头
print(c.startswith('你好'))
# 判断字符串是否用指定内容结尾
print(c.endswith('啊'))
3.4查找操作
在字符串中查找有没有某个子串的操作
~index / rindex
~find / rfind
a = 'Oh apple, i love apple.'
# index - 从左向右寻找指定的子串(substring),可以指定从哪开始找,默认是0
# 找到了返回子串对应的索引(下标),找不到直接报错(程序崩溃)
print(a.index('apple'))
print(a.index('apple', 10))
print(a.rindex('apple'))
# find找到了返回子串对应的索引(下标),找不到不会报错(返回-1)
print(a.find('apple'))
print(a.find('apple', 10))
print(a.rfind('apple'))
print(a.find('banana'))
print(a.rfind('banana'))
3.5字符串的拆分和合并
content1 = 'You go your way, I will go mine'
content2 = content1.replace(',', '').replace('.', '')
words = content2.split()
print(words, len(words))
for word in words:
print(word)
# 用空格拆分字符串,最多允许拆分3次
words = content2.split(' ', maxsplit=3)
print(words, len(words))
# 从右往左进行字符串拆分,最多允许拆分3次
words = content2.rsplit(' ', maxsplit=3)
print(words, len(words))
# 用逗号拆分字符串
items = content1.split(',')
for item in items:
print(item)
content3 = [
'请不要相信我的美丽',
'更不要相信我的爱情',
'因为在涂满油彩的面孔下',
'有着一颗戏子的心'
]
# 将列表中的元素用指定的字符串连接起来
print(','.join(content3))
四、集合
4.1定义
集合的定义是“把一定范围的、确定的、可以区别的事物当作一个整体来看待”,集合中的各个事物通常称为集合的元素。集合应该满足以下特性:
- 无序性:一个集合中,每个元素的地位都是相同的,元素之间是无序的。
- 互异性:一个集合中,任何两个元素都认为是不相同的,即每个元素只能出现一次。
- 确定性:给定一个集合,任给一个元素,该元素或者属于或者不属于该集合,二者必居其一,不允许有模棱两可的情况出现。
4.2集合的运算
set1 = {1, 2, 3, 4, 5}
set2 = {2, 4, 6, 8}
# 成员运算---确定性(元素要么在集合中,要么不在集合中)
# 集合的成员运算在效率上是远远高于列表的成员运算
print(1 in set1)
print(1 not in set1)
# 交集
print(set1 & set2)
# 并集
print(set1 | set2)
# 差集(前有后没有)
print(set1 - set2)
print(set1.difference(set2))
print(set2 - set1)
# 对称差
print(set1 ^ set2)
print((set1 | set2) - (set1 & set2))
print(set1.symmetric_difference(set2))
set3 = {1, 2, 3, 4, 5, 6, 7, 8, 9}
# 判断真子集(<)
print(set1 < set3)
# 判断子集(<=)
print(set2 <= set3)
# 判断超集(>)
print(set3 > set2)
4.3集合的操作
set1 = {'apple', 'banana', 'pitaya', 'apple'}
# 添加元素
set1.add('grape')
print(set1)
# 删除元素
set1.discard('pitaya') # 指定删除
print(set1)
print(set1.pop()) # 随机删除
print(set1)
# 清空
set1.clear()
print(set1)
# 用集合给列表去重
nums = [1, 10, 1, 4, 4, 5, 6, 6, 1]
set2 = set(nums)
list1 = [set2]
print(list1)
4.5简单的总结
Python中的集合底层使用了哈希存储的方式,对于这一点我们暂时不做介绍,在后面的课程有需要的时候再为大家讲解集合的底层原理,现阶段大家只需要知道集合是一种容器,元素必须是hashable
类型,与列表不同的地方在于集合中的元素没有序、不能用索引运算、不能重复。
五、字典
5.1字典的创建
在Python中创建字典可以使用{}
字面量语法,这一点跟上一节课讲的集合是一样的。但是字典的{}
中的元素是以键值对的形式存在的,每个元素由:
分隔的两个值构成,:
前面是键,:
后面是值,代码如下所示。
# 字面量语法
student1 = {
'id': 1034,
'name': 'zhou',
'sex': True,
'birthday': 1998-5
}
print(student1)
# 构造器函数
student2 = dict(id=1034, name='zhou', sex=True)
print(student2)
5.2字典的运算
student1 = {
'id': 1034,
'name': 'zhou',
'sex': True,
'birthday': 1998
}
print(student1)
# 遍历字典中的键
for key in student1.keys():
print(key)
print('-' * 20)
# 遍历字典中的值
for value in student1.values():
print(value)
print('-' * 20)
# 遍历字典中的键值对
for key, value in student1.items():
print(key, value)
student = dict(id=1034, name='zhou', sex=True, birthday=1998)
# 字典的索引运算放在赋值运算符的左边,且索引对应的键是存在的,就更新它的值
student['name'] = '小黄'
student['sex'] = False
# 字典的索引运算放在赋值运算符的左边,但字典中没有对应的索引,就增加一组新的“键值对”
student['address'] = '重庆'
print(student)
print('name' in student)
print('age' in student)
print('address' in student)
# 使用get函数通过key获取value时,如果key不存在,不会发生keyError错误,
# 而是得到一个None(空值)或者是你指定的默认值。
print(student.get('age'))
print(student.get('age', 20))
print(student.get('name'))
# 删除键值对--->键必须存在,如果不存在会产生KeyError错误
# del student['name']
print(student.pop('name'))
# 如果要使用下标(索引)运算,那么必须要保证键一定存在
if 'birthday' in student:
print(student['birthday'])
5.3字典的相关操作
dict1 = {'A': 100, 'B': 200, 'C': 300}
dict2 = {'D': 400, 'E': 500, 'A': 600}
# 更新(元素的合并或更新)
dict1.update(dict2)
print(dict1)
# 删除
del dict1['B']
print(dict1) # 直接删除,不会返回删除的值
print(dict1.pop('A')) # 会把删除的元素返回
print(dict1)
dict1.popitem() # 是删除最后一个键值对
print(dict1)
# 输入一段话,统计每个英文字母出现的次数
x = input('请输入一段话:')
b = {}
for i in range(26):
b[f'{chr(i + 97)}'] = x.count(f'{chr(i + 97)}')
print(b)
# 方法二
import string
results = {letter: 0 for letter in string.ascii_lowercase}
print(results)
content = input('请输入:').lower()
for ch in content:
if ch in results:
results[ch] += 1
for key, value in results.items():
print(f'{key}: {value:>2d}次')
5.4简单的总结
Python程序中的字典跟现实生活中字典非常像,允许我们以键值对的形式保存数据,再通过键索引对应的值。这是一种非常有利于数据检索的数据类型,底层原理我们在后续的课程中再研究。再次提醒大家注意,字典中的键必须是不可变类型,字典中的值可以是任意类型。
一段话,统计每个英文字母出现的次数
x = input(‘请输入一段话:’)
b = {}
for i in range(26):
b[f’{chr(i + 97)}’] = x.count(f’{chr(i + 97)}’)
print(b)