Python基础 - 05字符串列表
一、字符串
1.1 字符串的格式
双引号或单引号中的数据,就是字符串,
使用一对引号来定义字符串,当出现符号冲突时可以使用转义字符,
使用三个单引号、双引号定义的字符串可以包含任意文本。
# 转义字符 print('haha\nhaha') # 换行 print('haha\thaha') # haha haha print('haha\\haha') # haha\haha print('haha\'hehehe\'haha') # haha'hehehe'haha print("haha\"h") # haha"h
Unicode的崛起
在20世纪60年代到80年代,最流行的字符编码方案是ASCII(美国信息交换标准编码)。
ASCII 比 Unicode 简单得多,但只能表示256个字符。对英语、法语和其他几种类似的语言而言,这足够了。
Unicode提供了一个大得多的字符编码集。
出于方便考虑,Unicode的前256个字母为ASCII码,如果只处理英文字符,几乎不用考虑Unicode的细节。
print(ord('a')) # 97 print(ord('b')) # 98 print(ord('A')) # 65 print(chr(66)) # B print(chr(99)) # c
s1 = 'hello' s2 = s1 s3 = 'hello' print(s1, s2, s3) # hello hello hello print(id(s1)) # 16035697648 print(id(s2)) # 16035697648 print(id(s3)) # 16035697648
# s1, s2, s3 指向同一个地址, 'hello'的内存地址
# is 判断 s4 = 'world' print(id(s4)) # 1041659770672 print(s1 is s3) # True print(s1 is s4) # False
1.2 字符串的下标和切片
# 字符串截取 字符串索引机制: 0 ~ len(s)-1 或 -len(s) ~ -1 s1 = 'ABCDEFG' print(s1[1]) # B print(s1[0]) # A # print(s1[9]) # IndexError: string index out of range print(s1[-1]) # G print(len(s1)) # 7 # 切片 格式:字符串变量[start:end) print(s1[1:4]) # BCD print(s1[0:5]) # ABCDE print(s1[:5]) # ABCDE print(s1[-3:-1]) # EF print(s1[-3:]) # EFG 从-3开始到结尾 x = s1[:] print(x) # ABCDEFG print(s1) # ABCDEFG print(id(x)) # 905626932208 print(id(s1)) # 905626932208 print(s1[1:-1]) # BCDEF print('*'*20) print(s1[:-1:2]) # ACE,从-len(s)到-1,step为2 print(s1[1::2]) # BDF print(s1[::4]) # AE # 字符串变量[start:end:step] 默认从左向右一个一个取元素 # step: 步长、方向。 正数->从左向右, 负数->从右向左 print(s1[::-1]) # GFEDCBA print(s1[::-2]) # GECA print(s1[0:6:-2]) # 为空 print(s1[6:0:-2]) # GEC
1.3 字符串常见操作
- 获取长度: len
- 查找内容: find / index / rfind / rindex
- 判断: startswith / endswith / isalpha / isdigit / isalnum / isspace / isnumeric
- 出现次数: count
- 替换内容: replace
- 切割字符串: split / rsplit / splitlines / partition / rpartition
- 修改大小写: capitalize / title / upper / lower / swapcase
- 空格处理: ljust / rjust / center / lstrip / strip
- 字符串拼接: join
注: 在Python中, 字符串是不可变的。所有字符串的相关方法,都不会改变原有字符串,都是返回一个结果。在新的返回值里,保留了执行后的结果。
# find: 从左向右查找,只要遇到一个符合要求的则返回位置。没有找到返回-1。 # rfind: 从右向左查找,只要遇到一个符合要求的则返回位置。没有找到返回-1。 # index 与 find 的区别: index如果没有找到会抛异常
path = 'https://pics2.baidu.com/feed/dong_0824ab18972bd4079fe54f4202278b580eb309a2.jpeg' i = path.find('_') print(i) # 33 第一个匹配到的位置 image_name = path[i + 1:] print(image_name) # 0824ab18972bd4079fe54f4202278b580eb309a2.jpeg i = path.find('#') print(i) # -1 未匹配到时,返回-1 # ValueError: substring not found # i = path.index('#') # print(i) i = path.rfind('.') suffix = path[i:] print(suffix) # .jpeg n = path.count('.') print(n) # 3 s = '0824ab18972bd4079fe54f4202278b580eb309a2.jpeg' result = s.startswith('08') print(result) # True result = s.endswith('mp5') print(result) # False s = 'HELLO' result = s.isalpha() print(result) # True s = 'A1234_' result = s.isalnum() print(result) s = '11123' result = s.isdigit() print(result) s = ' ' result = s.isspace() print(result) # '' -> False ' '-> True ' '-> True s='helloA' result = s.isupper() print(result) result = s.islower() print(result)
s = '佛祖说: 阿弥陀佛,南无阿弥陀佛!' result = s.replace('佛', '**') print(result) # **祖说: 阿弥陀**,南无阿弥陀**! result = s.replace('佛', '**', 1) print(result) # **祖说: 阿弥陀佛,南无阿弥陀佛! result = s.replace('佛说', '##', 1) # replace(old, new, count) print(result) # 佛祖说: 阿弥陀佛,南无阿弥陀佛! s = '张三 李四 王五' result = s.split(' ') print(result) # ['张三', '李四', '王五'] s = '''第一行唱山歌 第二行唱土歌 第三行唱歌 ''' result = s.splitlines() print(result) # ['第一行唱山歌', '第二行唱土歌', '第三行唱歌'] s = '张三 李四 王五' result = s.partition(' ') print(result) # ('张三', ' ', '李四 王五') result = s.rpartition(' ') print(result) # ('张三 李四', ' ', '王五')
s = 'hello world' result = s.title() print(result) # Hello World result = s.upper() print(result) # HELLO WORLD result = s.lower() print(result) # hello world result = s.capitalize() print(result) # Hello world
s = ' admin ' print(len(s)) # 7 result = s.strip() print(len(result)) # 5 print(result) # admin result = s.lstrip() print(len(result)) # 6 print(result) # admin_ result = s.rstrip() print(len(result)) # 6 print(result) # _admin s = 'hello world' result = s.center(30) print(result) # | hello world | result = s.ljust(30) print(result) # hello world | result = s.rjust(30) print(result) # | hello world
name = '赵丽颖' age = 30 result = '美女{}今年{}岁'.format(name, age) print(result) # 美女赵丽颖今年30岁 result = '美女{0}今年{1}岁,我也是{1}岁'.format(name,age) print(result) # 美女赵丽颖今年30岁,我也是30岁 result = '美女{girl}今年{a}岁,我也是{a}岁'.format(girl='君君',a=1) print(result) # 美女君君今年1岁,我也是1岁 stu_name = '艾玛' score_math = 100 score_chinese = 90 s = '{0}本次考试数学分数为:{2},语文分数为:{1},英语分数为:{2}'.format(stu_name,score_chinese,score_math) print(s) # 艾玛本次考试数学分数为:100,语文分数为:90,英语分数为:100
s.maketrans(old,new) 创建一个转换表,用于将old中的字符改成new中的相应字符;
s.translate(table) 使用指定转换表(使用maketrans创建的)对s中的字符进行替换
s.zfill(width) 在s左边添加足够多的0,让字符串的长度为width
s = 'aabbcc' table = s.maketrans('abc','ABC') print(s.translate(table)) # AABBCC print('23'.zfill(4)) # 0023 print('-87'.zfill(5)) # -0087
s = '_' print(s.join('abc')) # a_b_c print(s.encode()) # b'_' s = 'aaBBcc' print(s.swapcase()) # AAbbCC
二、列表
2.1 定义列表
list1 = [] # 空列表 list2 = ['牛奶', '面包', '火腿', '辣条', '馒头'] print(type(list1)) # <class 'list'> print(list2[3]) # 辣条 print(list2[0]) # 牛奶
2.2 列表操作
# 切片 [start,end) print(list2[1:3]) # ['面包', '火腿'] print(list2[:2]) # ['牛奶', '面包'] print(list2[::-3]) # ['馒头', '面包'] print(list2[::3]) # ['牛奶', '辣条'] print(list2[-2:-5:-2]) # ['辣条', '面包'] print(list2[-2::-5]) # ['辣条'] 从右向左,-2到-5
# 添加 list1 = [] list2 = ['面包'] list1.append('苹果') list1.append('香蕉') list1.append('木瓜') print(list1) # ['苹果', '香蕉', '木瓜'] list1.append(list2) print(list1) # ['苹果', '香蕉', '木瓜', ['面包']] list1 = list1 + list2 print(list1) # ['苹果', '香蕉', '木瓜', ['面包'], '面包'] list1.extend(list2) print(list1) # ['苹果', '香蕉', '木瓜', '面包'] print(list1 * 2) # ['苹果', '香蕉', '木瓜', '面包', '苹果', '香蕉', '木瓜', '面包']
if '苹果' in list1: print('存在') else: print('不存在')
# pop(index): 根据下标删除列表中的元素,不能超出范围 # pop(): 从后往前依次删除 list1 = ['苹果', '香蕉', '木瓜', '面包', '馒头'] list1.pop() print(list1) # ['苹果', '香蕉', '木瓜', '面包'] list1.pop() print(list1) # ['苹果', '香蕉', '木瓜']
# remove: 只删除匹配到,如果列表中有多个同名元素,只删除遇到的第一个元素,后面的元素不会被删除。 list2 = ['苹果', '馒头', '香蕉', '木瓜', '面包', '馒头'] list2.remove('馒头') print(list2) # ['苹果', '香蕉', '木瓜', '面包', '馒头'] # ValueError: list.remove(x): x not in list # list2.remove('菠萝') list2 = ['苹果', '馒头', '香蕉', '木瓜', '面包', '馒头'] for i in list2: if i == '馒头': list2.remove(i) print(list2) # ['苹果', '香蕉', '木瓜', '面包'] list3 = ['苹果', '馒头', '馒头', '馒头', '香蕉', '木瓜', '面包', '馒头', '菠萝'] for i in list3: if i == '馒头': list3.remove(i) print(list3) # ['苹果', '香蕉', '木瓜', '面包', '馒头','菠萝'] list4 = ['苹果', '馒头', '馒头', '香蕉', '木瓜', '面包', '馒头', '菠萝'] n = 0 while n < len(list4): if list4[n] == '馒头': list4.remove('馒头') else: n += 1 print(list4) # ['苹果', '香蕉', '木瓜', '面包', '菠萝']
list1 = [1, 2, 3, 4, 5, 6] list1.insert(1, 8) print(list1) # [1, 8, 2, 3, 4, 5, 6] list1[1] = 9 print(list1) # [1, 9, 2, 3, 4, 5, 6] pos = list1.index(4) list1[pos] = 14 print(list1) # [1, 9, 2, 3, 14, 5, 6] li = ['苹果', 1, 2, '苹果', '苹果', 45, 12, '苹果'] for i in range(li.count('苹果')): li.remove('苹果') print(li) # [1, 2, 45, 12] del li # NameError: name 'li' is not defined # li.append(10) # print(li)
list1 = [1, 2, 3, 4, 5, 6] print(id(list1)) # 418405881856 list2 = list1 print(list2) # [1, 2, 3, 4, 5, 6] print(id(list2)) # 418405881856 list2.append(88) print(list1) # [1, 2, 3, 4, 5, 6, 88] print(list2) # [1, 2, 3, 4, 5, 6, 88] list1.clear() print(list2) # [] del list2 print(list1) # [] a = 'hello' b = a c = a del a print(b, c) # hello hello
import random numbers = [] for i in range(8): ran = random.randint(1,20) numbers.append(ran) print(numbers) # [15, 6, 20, 6, 4, 8, 16, 13] numbers.sort() # 默认为升序 print(numbers) # [4, 6, 6, 8, 13, 15, 16, 20] numbers.sort(reverse=True) print(numbers) # [18, 17, 13, 10, 9, 6, 1, 1] # 反转 numbers.reverse() # [18, 5, 17, 19, 3, 6, 7, 10] print(numbers)
# 自引用列表: 让一个列表元素指向列表本身 # 打印输出中的[...]表明,Python能够识别自引用,没有愚蠢地不断打印列表。 lst = [1, 2, 'c', 'd', 'f'] lst[2] = lst print(lst) # [1, 2, [...], 'd', 'f']
# 列表循环 numbers = [18, 5, 17, 19, 3, 6, 7, 10] for i in numbers: print(i)
#交换两个变量的值 a = 2 b = 3 print(a, b) # 2 3 c = a a = b b = c print(a, b) # 3 2 a, b = b, a print(a, b) # 2,3
# 手动冒泡排序: num = [] for i in range(8): ran = random.randint(1, 100) num.append(ran) print('排序前的num:', num) for i in range(len(num)-1): for j in range(len(num)-1-i): if num[j] > num[j + 1]: temp = num[j] num[j] = num[j + 1] num[j + 1] = temp else: j += 1 print('第{}次排序结果为{}'.format(i,num)) print('排序后的num:', num) #----------------------------------- 排序前的num: [89, 54, 41, 31, 82, 70, 42, 15] 第0次排序结果为[54, 41, 31, 82, 70, 42, 15, 89] 第1次排序结果为[41, 31, 54, 70, 42, 15, 82, 89] 第2次排序结果为[31, 41, 54, 42, 15, 70, 82, 89] 第3次排序结果为[31, 41, 42, 15, 54, 70, 82, 89] 第4次排序结果为[31, 41, 15, 42, 54, 70, 82, 89] 第5次排序结果为[31, 15, 41, 42, 54, 70, 82, 89] 第6次排序结果为[15, 31, 41, 42, 54, 70, 82, 89] 排序后的num: [15, 31, 41, 42, 54, 70, 82, 89]