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]