数据类型:列表
官方是这样定义的,列表是一种有序的集合,可以随时增加或删除其中的元素,标识是中括号[]。比如
list=['小明',18,1.70]
你有没有发现,列表里面有字符串,有整数,有小数呢?没错,这就是列表的包容性,什么都可以装。
那么当我们把元素放入列表之后,做什么呢?当然是提取出来。比如我想提取第一个该怎么写呢?
提取单个元素
公式是:列表名后加带偏移量的中括号。
list=['小明',18,1.70]
# 正值索引 打印列表第一个元素,从0开始
print(list[0])
# 负值索引 打印列表倒数第一个元素
print(list[-1])
什么是偏移量呢?简单理解就是从左到右的顺序,并且python是从0开始,也就是第一个 “小明”是0。所以提取小明就是 list[0],第二个18就是 list[1]
如果遇到多层嵌套,提取方式就像剥洋葱,从外到内,比如下面我想提取小红这个元素,就要看小红在下面列表的第一个列表里的第二个。所以就是name[0][1]
# 多层嵌套使用下面这种换行写法,看起来更清晰
name = [
['小明','小红','小刚','小美'],
['小强','小兰','小伟','小芳']
]
print(name[0][1]) #取第一个列表的第二个值,结果小红
提取多个元素(切片)
这里我们要引入另外一个名字叫【切片】,什么是切片呢?可以理解为一个刀片切开了列表,而这个刀片是冒号。记住口诀,左+1取 到 右不取,怎么理解呢?比如下面案例里的[1,4],套用我们的公式就是取值范围就是第二到第四。
切片运算符的语法是[start: end: step],其中,start表示开始索引,end表示结束索引,step表示步长(切片间隔,可以是正数,也可以是负数,不填则默认为1,步长为2,间隔就是1)
他们三个的关系是 [start+1: end step-1],比如[0: 5: 2],那么取值范围
list = [5,6,7,8,9]
print(list[:])
# 所有:打印出[5,6,7,8,9]
print(list[2:])
# 从第3个开始后面所有:打印出[7,8,9]
print(list[:3])
# 第3个开始到前面所有:打印出[5,6,7]
print(list[1:4])
# 代表第2个到第4个:打印出[6,7,8]
print(list[0:-2])
# 代表第一个到倒数第二个,左取右不取结果就是 [5,6,7]
# 加上步长 ——————————————————————————————————————————
print(list[0:4:2])
# 代表第1个到第4个,步长为2,也就是中间隔一个进行取值:打印出[5,7]
print(list[::2])
# 两个冒号代表全取,步长2代表隔一个,打印出[5,7,9]
print(list[::-1])
# 两个冒号代表全取,步长-1代表倒叙,打印出[9, 8, 7, 6, 5]
# 负数时候注意 ——————————————————————————————————————————
print(list[-1:-4])
# 取值是从左往右,所以这里的结果是空,-1是最后一位数并且不取左边的值,往右没有值
print(list[-4:-1])
# 结果 [6, 7, 8]
方法与函数
在介绍添加/删除列表之前,我先补充一个知识点来作为铺垫,让你更好的理解下面内容。
我们来看下《Python编程 从入门到实践》里是如何解释的:拿下面案例的第3行举例
在print() 语句中,方法title() 出现在这个变量的后面。方法是Python可对数据执行的操作。在name.title() 中,name 后面的句点(. )让Python对变量name 执行方法title() 指定的操作。每个方法后面都跟着一对括号,这是因为方法通常需要额外的信息来完成其工作。这种信息是在括号内提供的。函数title() 不需要额外的信息,因此它后面的括号是空的。
听起来有点绕,我们直接用案例说明,仔细观察,看到他们的不同了吗?
方法是用点来使用,函数则不需要。
常用方法
name = ' jiao chenglong'
# title 首字母大写
print(name.title())
# upper 全部大写
print(name.upper())
# lower 全部小写
print(name.lower())
# strip 去除变量开头和结尾的空格 lstrip左边空格 rstrip 右边空格
print('|'+name.strip()+'|')
print('|'+name.lstrip()+'|')
print('|'+name.rstrip()+'|')
# find 找到变量的位置索引值,如果有多个会显示第一个位置,如果没找到结果是-1
print(name.find("o")) # 结果是4
print(name.find("A")) # 结果是-1
# find 我们加上取值范围,在第一和第五个字符之间查找字母i
print(name.find("i", 0, 5)) # 结果是2
# replace 替换 把 o 换成 *
print(name.replace("o", "*"))
# replace 后面不填代表删除
print(name.replace("chenglong", ""))
# count子字符串出现的次数
print(name.count('o')) # 结果是 2
# split分割
s1 = "123,056,089"
a = s1.split(',') # 以 , 分割
print(a) # 结果是 ['123', '056', '089']
s2 = "".join(a) # 定义一个字符串(里面的空是连接符),然后把a里的值(['123', '056', '089'])提取出来
print(s2) # 结果是123056089
s3 = "-".join(a) # 定义一个字符串(连接符是-)
print(s3) # 结果是123-056-089
他们的结构都是变量名+点+另外一个词+括号,而这个“另外一个词”我们称之为【方法】,python里面有许许多多的方法,下面我们的添加和删除用的也是方法的其中之一。
注意:下面所有的偏移量仍然是从0开始计数。新增和修改必须是数据类型一致,比如 names = [1, 2, 3],列表里面的值是整数类型,所以添加元素 names.append(2) 里面的值(2)必须也是整数类型。
**
# 【新增】append() 默认添加元素到末尾————————————————————————————
# 一次只能给一个参数
names = [1, 2, 3]
names.append(2)
print(names) # 结果是[1, 2, 3, 2]
# 用列表/字典可以添加多个,但是会出现俄罗斯套娃一样的多层嵌套
names = [1, 2, 3]
names.append([4, 5])
names.append({6, 7, 8})
print(names) # 结果是[1, 2, 3, [4, 5], {8, 6, 7}]
# 【新增】insert() 添加元素具体的位置——————————————————————————
names = [5, 6, 7, 8]
names.insert(2, 0) # insert(i,x),i表示插入位置(可以是负数),x表示插入值(类型必须和列表一致)
print(names) # 结果是[5, 6, 0, 7, 8]
names = [5, 6, 7, 8]
names.insert(-3, 0) # 先找下标-3对应的值是6,然后6的下标是1,所以相当于 insert(1,0)
print(names) # 结果是[5, 0, 6, 7, 8]
# 【新增】extend([新列表]) 在列表追加多个元素——————————————————————————
names = [1, 2]
names.extend([3, '4']) # 是列表形式,可以多种类型
print(names) # 结果是[1, 2, 3, '4']
# 【删除】pop() ————————————————————————————————————————————————————
# 为空时默认删除(弹出)列表最后一个元素
names = [11, 12, 13]
hello = names.pop()
print(hello) # 结果13
# pop(1) 弹出列表第二个元素
names = [11, 12, 13]
hi = names.pop(1)
print(hi) # 结果12
# pop(1) 弹出列表第二个元素并把剩余的打印出来
names = [11, 12, 13]
names.pop(1)
print(names) # 结果[11, 13]
# 【删除】remove() 括号里面直接跟列表的值而非下标值,并且只能是一个值;如果匹配到多个值,则删除第一个。
names = [1, 2, 3]
names.remove(1) # 这里删除的是值,而非下标(偏移量)
print(names) # 结果是[2, 3]
# 【删除】del 列表[偏移量] 删除列表的第二位元素——————————————————————————————————
names = [1, 2, 3, 4, 5, 6]
del names[1] # 删除第二个数字2 此时结果是[1, 3, 4, 5, 6]
del names[2:] # 再使用切片,删除多个
print(names) # 结果是[1, 3]
# 【修改】修改元素是给元素直接赋值即可——————————————————————————
names = [10, 20, 30]
names[0] = 80
print(names) # 结果是[80, 20, 30]
names = [10, 20, 30]
names[0], names[1] = names[1], names[0] # 互换位置
print(names) # 结果是[20, 10, 30]
# 【排序】sort() ————————————————————————————————————————————————————
mylist = [1, 3, 2, 5, 4]
# 使用方法sort()对列表进行正排序(永久性)
mylist.sort()
print(mylist) # 结果是 [1, 2, 3, 4, 5]
# 使用 #函数# sorted()对列表进行正排序(临时性)
print(sorted(mylist)) # 结果是 [1, 3, 2, 5, 4] 重新输出发现排序没变
# 可以给sort()方法传递参数 reverse=true
mylist.sort(reverse=True)
print(mylist) # 结果是 [5, 4, 3, 2, 1]
mylist.sort(reverse=False)
print(mylist) # 结果是 [1, 2, 3, 4, 5]
# 【排序】reverse() ————————————————————————————————————————————————————
# 使用方法reverse()反转排序,是反转 不是按照字母反转,类似于 list[::-1]
cars = [1, 2, 3, 4, 5]
cars.reverse()
print(cars) # [5, 4, 3, 2, 1]
# print(cars[::-1])
pop是暂时弹出并调用这个元素,del是直接删除列表的元素,无法后续使用。**
函数
注意:同一类型从能进行排序,比如 list=[0,’1’],这样的不同类型,是不可以进行排序的。
fruit = "Hello,world"
print(len(fruit)) # len获取字符串长度,结果是11
print(len(fruit)-1) # 获取最后一个值的下标值(获取总长度,然后减去一) 结果是11
print(fruit[10]) # 打印第11个元素的值,结果是d
print(fruit.index('w')) # 获取元素w的下标值,结果是6
print(fruit[-1]) # 获取最后一个元素的值 结果是d
# in or not in 结果是布尔值
print("ao" in name)
print("ao" not in name)
# 使用 #函数# sorted()对列表进行排序(临时性)
cars = ['1', 'A', 'a', '05', '4']
print(sorted(cars)) # 结果是 ['05', '1', '4', 'A', 'a']
print(cars) # 结果是 ['1', 'A', 'a', '05', '4'] 重新输出发现排序没变
print(min(cars)) # 结果是05
print(max(cars)) # 结果是a
数据类型:字典
字典和列表一样,都是元素,不过字典的元素是由键和值组成,并用大括号{}括起来。
list ={'小明':90,'小李':86}
这里面的小明就是【键】,而对应的数值就是【值】,把他们两个用冒号连接起来就叫【键值对】,上面有两个键值对 小明:90和小李:86
需要注意的是:字典里的【键】是唯一的不能重复的,但是【值】是可以重复。因为对应键里面的数值后续调用都是取的键,重复了程序是无法调取的。列表用偏移量,字典用键。
#列表用偏移值
list =['小明:90','小李:86']
print(list[0]) #结果小明:90
#字典用键
list ={'小明':90,'小李':86}
print(list['小明']) #结果90
新增键值对的公式:字典名[键] = 值;删除键值对的公式:del 字典名[键]
list = {'小明': 90, '小李': 86}
# 增,使用键
list['小黑'] = 60
print(list)
# 删 使用del或 pop方法,后面跟的是key
list.pop('小李')
print(list)
# 改,使用键重新赋值
list['小黑'] = 68
print(list)
# 查
print(list['小黑']) #这种方式,如果小黑不存在,则会报错,所以我们用下面的get
name = list.get("A", -1) # 找A这个键对应的值,如果没有输出-1
print(name)
name = list.setdefault("B", -1) # 找A这个键对应的值,如果没有输出-1,并且新增该键值对
print(name)
print(list)
字典和列表的不同点:列表有明确的顺序,所以取值用的偏移量;字典没有顺序,所以取值用的是唯一的键。
s = {'小明': 90, '小李': 86, '小红': 68}
for i in s: # 遍历字典中的键和值
print(f"key={i},values={s[i]}")
for k in s.keys(): # 遍历字典中的键
print(k)
for v in s.values(): # 遍历字典中的值
print(v)
for k, v in s.items(): # 遍历字典中的键和值
print(f"key={k},values={v}")
l = list(s.keys()) # 把键转化为列表
print(l)
t = tuple(s.values()) # 把值转化为元祖
print(t)
和list比较,dict有以下几个特点:查找和插入的速度极快,不会随着key的增加而变慢;需要占用大量的内存,内存浪费多。所以,dict是用空间来换取时间的一种方法。请一定要记得,dict的key必须是不可变对象。这也是为什么他查询更快的原因。
str是不变对象,而list是可变对象。对于不变对象来说,调用对象自身的任意方法,也不会改变该对象自身的内容。相反,这些方法会创建新的对象并返回,这样,就保证了不可变对象本身永远是不可变的。
# 可变的列表
a = ['c', 'b', 'a']
a.sort()
print(a) # ['a', 'b', 'c']
# 不可变的字符串
b = 'abc'
print(b.replace('a', 'A')) # Abc,也可以理解为临时修改
print(b) # abc
遍历字典
config = {
'ip': '192.168.1.1',
'port': '8080',
'name': 'jiao',
# 字典
'options': {
'encode': 'utf-8',
'timeout': '300',
},
# 列表
'driver': ['pgsql', 'npgsql']
}
print(config['options']) # 打印字典config里的字典
print(config['driver']) # 打印字典config里的列表
# 遍历所有属性
for key, Val in config.items():
print(key, '=', Val)
# 遍历所有的key(常用)
for key in config.keys():
print('key =', key)
# 遍历所有的value(少用)
for Val in config.values():
print('Val =', Val)
数据类型:元组
另外这里延展一个知识点【元组】(tuple)。元组和列表很相似,不过它是用小括号来包的。元组和列表都是序列,提取的方式也是偏移量,也支持任意的嵌套,不同的是元组不可修改,没有append(),insert()这样的方法!
不可变的tuple有什么意义?因为tuple不可变,所以代码更安全。如果可能,能用tuple代替list就尽量用tuple。
#元组用的是小括号
list =('小明','小李','小黑')
print(list[2])
#多层嵌套,用中括号和逗号分开
list = [('小明','小李'),('小黑','小兰')]
print(list[1][0])
列表推导式
它的结构是 [表达式 for 变量 in 列表 if 筛选条件] ,外面的大括号说明生成的直接是列表形式,所以不需要新建空列表和添加列表的动作。
list1 = [1, 2, 3]
list2 = []
# 将列表里的值x2的常规用法
for i in range(3):
list2.append(list1[i]*2) # 注意这里用的是list[]下标,是用里面的值x2 不是列表x2
print(list2) # [2, 4, 6]
# 使用推导式将列表里的值x2的写法
list3 = [i*2 for i in list2] # [表达式 for 变量 in 列表]
print(list3) # [4, 8, 12]
# 加入筛选条件 ——————————————————————————————————
# 常规写法
list4 = []
for i in range(10):
if i % 2 == 0:
list4.append(i*2)
print(list4) #[0, 4, 8, 12, 16]
# 推导式写法
list5 = [i*2 for i in range(10) if i % 2 == 0] # 如果能被2整除,那么就 x2
print(list5) #[0, 4, 8, 12, 16]
# 转化类型 ———————————————————————————————————
list6 = [5, 6, 7, 8]
list7 = [str(i) for i in list6 if i >= 7]
print(list7) # ['7', '8']
list8 = ['hello', 'a', '123']
list9 = [i.title() for i in list8] #使用方法可以对遍历的值进行修改
print(list9) # ['Hello', 'A', '123']
# 放在表达式里打印结果 ———————————————————————————————————
list10 = range(10)
[print(i) for i in list10]