Python基础数据类型-列表(list)、元组(tuple)、字典(dict)和集合(set)
1. 序列和索引
-
序列
-
示例 1
s = 'hello'
for i in range(0,len(s)):
print(i,s[i],end='\t\t')
结果:0 h 1 e 2 l 3 l 4 o
- 示例 索引
#正向递增索引
s1 = 'helloworld'
for i in range(0,len(s1)):
print(i,s1[i],end='\t\t')
print('\n-------------------------')
#逆向递减索引
s2 = "helloworld"
for i in range(-len(s2),0):
print(i,s2[i],end='\t\t')
print('\n-------------------------')
print(s1[9],s2[-1])
结果:
0 h 1 e 2 l 3 l 4 o 5 w 6 o 7 r 8 l 9 d
-------------------------
-10 h -9 e -8 l -7 l -6 o -5 w -4 o -3 r -2 l -1 d
-------------------------
d d
2.列表(list)
列表:可变数据类型:具有增删改查方法,在进行增删改查时,列表的内存地址不变
元素个数可变,但内存地址不变
- 示例 1:插入
# 1.1 插入append()
num = [1,2,3,4,5,6]
print("原列表:",num,id(num))
结果:原列表: [1, 2, 3, 4, 5, 6] 2969153957248
num.append(7)
print("新列表:",num,id(num))
结果:新列表: [1, 2, 3, 4, 5, 6, 7] 2969153957248
num.append(('hello','world'))# 添加元组
print(num)
结果:[1, 2, 3, 4, 5, 6, 7, ('hello', 'world')]
解释:向列表中添加元组, 元组会以一个整体元素添加倒列表中
lst = [2008,2022]
lst.append(2035)
lst.append(['2025',2025]) #作为整体添加
print(lst) # [2008, 2022, 2035, ['2025', 2025]]
------------------------------------------------------------------
# 1.2 插入insert()
num = [1,2,3,4,5,6]
num.insert(num[0],0)
print(num)
结果:[1, 0, 2, 3, 4, 5, 6]
解释:num[0] = 1,所以在地址为1处插入0
num.insert(0,0)
print(num)
结果:[0, 1, 0, 2, 3, 4, 5, 6]
解释:num已经是新列表,在新列表地址为0出插入0
num.extend([8,9])
print(num)
结果:[0, 1, 0, 2, 3, 4, 5, 6, 8, 9]
解释:在末尾插入多个数据,以列表形式插入
- 示例 2:删除
# 2.1 删除remove()
eggs = ["鸡蛋","鸭蛋","鹅蛋","鸟蛋"]
eggs[1],eggs[3] = eggs[3],eggs[1] # 交换位置
print(eggs) # 结果:['鸡蛋', '鸟蛋', '鹅蛋', '鸭蛋']
eggs.remove("鸡蛋") #删除
print(eggs) # 结果:['鸟蛋', '鹅蛋', '鸭蛋']
---------------
# 2.2 删除pop()
eggs.pop(0) # 删除位置0元素
print(eggs) # 结果:['鹅蛋', '鸭蛋']
---------------
# 2.3 删除del
del eggs[0] # 删除位置0元素
print(eggs) # 结果:['鸭蛋']
eggs.pop() # 默认删除位置0元素
print(eggs) # 结果:[]
---------------
# 2.4 删除clear
eggs = ["鸡蛋","鸭蛋","鹅蛋","鸟蛋"]
eggs[1],eggs[3] = eggs[3],eggs[1] # 交换位置
print(eggs,id(eggs)) # 结果:['鸡蛋', '鸟蛋', '鹅蛋', '鸭蛋'] 1461112697984
eggs.clear()
print(eggs,id(eggs)) # 结果:[] 1461112697984
- 示例3:修改
# 3.1 reverse() 翻转输出
eggs = ["鸡蛋","鸭蛋","鹅蛋","鸟蛋"]
eggs.reverse() # 结果:['鸟蛋', '鹅蛋', '鸭蛋', '鸡蛋'
print(eggs) # 在原列表的基础上修改,不会产生新表
print(eggs.reverse()) #None reverse()方法没有返回值
-------------------
# 3.2 copy() 复制
list2 = eggs.copy() #复制 内存地址会改变 新表
print(list2) # 结果:['鸟蛋', '鹅蛋', '鸭蛋', '鸡蛋']
- 示例4:排序
# 4.1 sort()
#字母排序 -> 根据ASCII码排序,先排大写,在排小写
lst = ["Cat","Apple","Banana","Dog"]
lst.sort()
print(lst) #结果:['Apple', 'Banana', 'Cat', 'Dog']
lst.sort(reverse=True)
print(lst) #结果:['Dog', 'Cat', 'Banana', 'Apple']
----------------
# 4.2 自己指定规则排序
lst = ["cat","Apple","banana","Dog"]
lst.sort() # 先排大写,再排小写
print(lst) #结果:['Apple', 'Dog', 'banana', 'cat']
# 忽略大小写排序
lst.sort(key=str.lower) # str.lower 都转化为小写,再排序,参数不加(),调用才加括号
print(lst) #结果:['Apple', 'banana', 'cat', 'Dog']
lst.sort(key=str.upper) #str.upper都转化为大写
print(lst) #结果:['Apple', 'banana', 'cat', 'Dog']
- 示例5:列表生成式
import random
lst = [item for item in range(1,11)]
print(lst)
lst = [item*item for item in range(1,11)]
print(lst)
lst = [random.randint(1,100) for _ in range(10)] # 1,100的随机数
print(lst)
#从列表中选择符合条件的元素组成新列表
lst = [i for i in range(10) if i % 2 ==0]
print(lst)
- 示例6:二维列表:
# 二维列表 表格数据
lst = [
["城市","环比","同比","定基"],
["北京",10,20,30],
["上海",20,30,40]
]
print(lst)
# 遍历二维列表使用双层for循环
for i in lst: #行
for j in i: #列
print(j,end="\t")
print()
# 在第一次迭代时,row 将会是 ["城市","环比","同比","定基"];在第二次迭代时,row 将会是 ["北京",10,20,30];依此类推。
-----------------------
# 列表生成式,生成一个4行5列的二维表
lst2 = [[ j for j in range(5)] for i in range(4)]
>解释:for i in range(4) 四行,
列表当中元素为 列表[ j for j in range(5)]
for j in range(5) 五列
列表[ j for j in range(5)]当中元素为 j
print(lst2)
for i in lst2:
for j in i:
print(j,end="\t")
print()
# 结果:
[[0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4]]
0 1 2 3 4
0 1 2 3 4
0 1 2 3 4
0 1 2 3 4
3.元组 (tuple)
3.1 含义及使用:
-
是Python中内置的不可变序列
-
在Python中使用()定义元组,元素与元素之间使用英文的逗号分隔⭐⭐
-
元组中只有一个元素的时候,逗号也不能省略⭐⭐
3.2 创建方式:
-
- 使用()直接创建元组
语法结构
:元组名=(element1,element2,element3,...elementN)
-
- 使用内置函数tuple()创建元组
语法结构
:元组名=tuple(序列)
3.3 创建应用:
t0 = ("hello")
print(t0,type(t0)) #结果:hello <class 'str'>
t1 = ("hello",)# 注意逗号,如果元组中只有一个元素,逗号不能省⭐⭐
print(t1,type(t1)) #结果:('hello',) <class 'tuple'>
t2 = tuple("world")
print(t2,type(t2)) #结果:('w', 'o', 'r', 'l', 'd') <class 'tuple'>
t3 = tuple([2,3,4,5])
print(t3,type(t3)) #结果:(2, 3, 4, 5) <class 'tuple'>
3.4 元组操作
t = tuple([2, 3, 4, 5])
print(t, type(t))
print("3是否在t中:",(3 in t))
print("1是否在t中:",(1 in t))
print("1是否不在t中:",(1 not in t))
print("元组t中的最大值:",max(t))
print("元组t中的最小值:",min(t))
print("t.index:",t.index(5))
print("t.count:",t.count(2))
---
结果:
(2, 3, 4, 5) <class 'tuple'>
3是否在t中: True
1是否在t中: False
1是否不在t中: True
元组t中的最大值: 5
元组t中的最小值: 2
t.index: 3
t.count: 1
3.5 删除元组
del 元组名
3.6 元组元素遍历与访问
- 访问:
t = tuple([2, 3, 4, 5])
print(t) #结果:(2, 3, 4, 5)
print(t[0]) #结果:2
t1 = t[0:3] #元组支持切片
print(t1) #结果:(2, 3, 4)
t2 = t[0:4:2]
print(t2) #结果:(2, 4)
t3 = t[:]
print(t3) #结果:(2, 3, 4, 5)
- 遍历:
》一:for
t = tuple([2, 3, 4, 5])
for i in t:
print(i,end="\t")
结果:2 3 4 5
----------------
》二:#for + range() +len()
t = tuple([2, 3, 4, 5])
for j in range(len(t)):
print(j,t[j],sep="-->",end="\t")
结果:0-->2 1-->3 2-->4 3-->5
-----------------
》三:#enumerate 枚举
for index,item in enumerate(t):
print(index,item,sep="-->",end="\t")
结果:0-->2 1-->3 2-->4 3-->5
3.7 元组生成表达式
# 元组
t = (i for i in range(1,4))
print(t)
# t = tuple(t)
# print(t)
#遍历
# for item in t:
# print(item,end="\t")
----
结果:
<generator object <genexpr> at 0x000001CD375A4E80>
(1, 2, 3)
1 2 3
------
#__next__方法 用于返回迭代器的下一个元素。
t = (i for i in range(1,4))
print(t)
print(t.__next__())
print(t.__next__())
print(t.__next__())
------
结果:
1
2
3
3.8 元组与列表区别
4.字典 (dict)
4.1 含义
-
可变数据类型
-
字典类型是根据一个信息查找另一个信息的方式构成了“键值对”,它表示索引用的键和对应的值构成的成对关系
-
不可变字符序列作为键⭐⭐⭐⭐⭐
4.2 创建方式
- 使用{}直接创建字典
- d ={key1:value1,key2:value2...}.
- 通过映射函数dict()创建字典
-
zip(lst1,lst2)
-
dict(key1:value1,key2:value2...)
-
4.3 字典的创建与删除
#(1)创建字典
d = {10:"cat",20:"dog",10:"pet"} # 字典默认去重,key相同时候,value值进行了覆盖
print(d)
结果:{10: 'pet', 20: 'dog'}
#(2)zip函数
lst1 = [1,2,3]
lst2 = ["cat","dog","pig"]
d1 = zip(lst1,lst2)
print(d1) # <zip object at 0x000001D7B0C73EC0> #映射结果是一个zip对象
print(dict(d1)) # 结果:{1: 'cat', 2: 'dog', 3: 'pig'}
---------------
lst1 = (1,2,3)
lst2 = ("cat","dog","pig")
d1 = zip(lst1,lst2)
print(d1)
d = dict(d1)
print(d)
#(3)使用参数创建字典
d = dict(cat=10,dog=20) # 左边cat为key,右边为value
print(d) # 结果:{'cat': 10, 'dog': 20}
t = (1,2,3)
t2 = ["cat","dog"]
print({t:10})
print(t2:20) # 结果:SyntaxError: invalid syntax
# 总结:列表不能作为字典的键值,可变数据类型不可作为字典当中的键⭐⭐
#(4)键值对的列表初始化
d = dict([(10, "cat"), (20, "dog")])
print(d)
结果:{10: 'cat', 20: 'dog'}
----------------------------------------------------------------------
> 问题:
d0 = dict(cat=40,dog=30) #正确
print(d0)
d = dict(10=cat,20=dog) #错误
print(d)
d1 = dict(cat:10,dog:20) #错误
print(d1)
> 原因:
1. 键不能直接用数字
在 Python 中,dict() 构造函数的键值对语法(如 key=value)要求键必须是合法的标识符(变量名)。数字(如 10 和 20)不能直接用作标识符,因此会引发语法错误。
------------
2. 键值对语法:dict() 构造函数需要使用等号 = 来指定键值对
# 注意:
字典中的key是无序的,
Python3.5及其之前的版本字典的key在输出时无序,但是从
Python3.6版本之后Python解释器进行了处理,所以才会看到输出的顺序与添加的顺序“一致”
4.4 字典的操作符
# 字典属于序列
d0 = {10:"banana",20:"apple"}
d1 = dict(cat=10,dog=20)
print(d0) # {10: 'banana', 20: 'apple'}
print(max(d0)) # 20
print("-"*30)
print(d1) # {'cat': 10, 'dog': 20}
print(max(d1)) # dog
# 最大,最小值输出的为键值,
print(min(d0)) # 10
print(min(d1)) # cat
print(len(d0)) # 2
print(len(d1)) # 2
4.5 字典的删除
d = {10:"cat",20:"dog"}
print(d) # {10: 'cat', 20: 'dog'}
del d
print(d) # NameError: name 'd' is not defined. Did you mean: 'id'?
4.6 字典元素的取值
# d[key]或者d.get(key) #d为字典名称
d = {10:"cat",20:"dog"}
print(d) # {10: 'cat', 20: 'dog'}
print(d[10]) # cat
print(d.get(20)) # dog
# d[key]或者d.get(key)二者之间的区别
# 如果key不存在,d[key]报错,而d.get(key)可以指定默认值
d = {10:"cat",20:"dog"}
# print(d[30]) # KeyError: 30
print(d.get(30,"不存在")) # 不存在
print(d.get(10,"不存在")) # cat
4.7 字典元素的遍历
- items()方法
# 1)遍历出key与value的元组
d = {10:"cat",20:"dog"}
print(d) # {10: 'cat', 20: 'dog'}
for i in d.items():
print(i)
结果:
(10, 'cat')
(20, 'dog')
# 2)分别遍历出key与value
d = {10:"cat",20:"dog"}
print(d) # {10: 'cat', 20: 'dog'}
for key,value in d.items():
print(key,value,sep="-->",end="\t")
结果:10-->cat 20-->dog
4.8 字典的i相关操作方法
- 应用
d = {10:"cat",20:"dog"}
print(d.keys()) # 结果:dict_keys([10, 20])
print(d.values()) # 结果:dict_values(['cat', 'dog'])
# print(d.pop(10)) # 结果:cat
# print(d.pop(20)) # 结果:dog
print(d.pop(30,"no")) # 结果:no
# print(d.popitem()) # 结果:(20, 'dog')
print(d) # 结果:{10: 'cat'}
print(d.clear()) # 结果:None
# python中一切皆对象,每个对象都有一个布尔值
print(bool(d)) #结果:False ,现在字典为空
4.9 字典生成式
# d={ key:value for item in range(1,4)}
d = {i:i*i for i in range(1,4)}
print(d)
# d={ key:value for key,value in zip(lst1,lst2)}
lst1 = [1,5,7]
lst2 = ["a","b","c"]
d = { key:value for key,value in zip(lst1,lst2)}
print(d)
5.集合 (set)
5.1 含义
-
Python中的集合与数学中集合的概念一致
-
Python中的集合是一个无序的不重复元素序列
-
集合中只能存储不可变数据类型 # 不能存储字典,不能存储列表
-
在Python中集合使用{}定义
-
与列表、字典一样,都是Python中的可变数据类型
5.2 集合的创建
# 1) 直接使用{}创建集合
- 语法结构:
- s={element1,element2,...elementN}
s = {1,2,3}
print(s,type(s))
# 结果:{1, 2, 3} <class 'set'>
----------------------------------------------------------
# 2)使用内置函数set()创建集合
- 语法结构:
- s=set(可迭代对象)
s = set() # 空集合
s = {} #创建的是字典
s = set(range(5,9))
print(s) # 结果:{8, 5, 6, 7} #集合无序
s = set("hello")
print(s) # {'h', 'e', 'l', 'o'} #集合不重复
5.3 集合的操作
# 集合属于序列中的一种
s = set(range(10))
print(s) # {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
print(max(s)) # 9
print(min(s)) # 0
print(len(s)) # 10
print("9在集合s中嘛?",9 in s) # 9在集合s中嘛? True
print("9不在集合s中嘛?",9 not in s) # 9不在集合s中嘛? False
5.4 集合的删除
del s
print(s) # NameError: name 's' is not defined
5.5 集合的操作符
s0 = set(range(3))
s1 = set(range(5))
print("s0:",s0,"s1:",s1)
print(s0 & s1) #交集:{0, 1, 2}
print(s0 | s1) #并集:{0, 1, 2, 3, 4}
print(s1 - s0) #差集:{3, 4}
print(s0 - s1) #差集:set()
print(s0 ^ s1) #补集:{3, 4}
print(s1 ^ s0) #补集:{3, 4}
5.6 集合相应的操作方法
s = set(range(3))
print(s) # {0, 1, 2}
s.add(3)
print(s) # {0, 1, 2, 3}
s.remove(0)
print(s) # {1, 2, 3}
s.clear()
print(s) # set()
5.6 集合遍历操作
s = set(range(5))
print(s)
for i in s:
print(i)
#结果:
{0, 1, 2, 3, 4}
0
1
2
3
4
-----------------
s = set(range(1,5))
print(s)
for i in enumerate(s):
print(i)
# 结果:
(0, 1)
(1, 2)
(2, 3)
(3, 4)
-------------
s = set(range(5))
for index,item in enumerate(s): # index是序号不是索引
print(index,"-->",item)
# 结果:
0 --> 0
1 --> 1
2 --> 2
3 --> 3
4 --> 4
5.6 集合的生成式
s = {item for item in range(5)}
print(s) # {0, 1, 2, 3, 4}
s = {i for i in range(10) if i %2 == 0}
print(s) # {0, 2, 4, 6, 8}
6. 列表,元组,字典,集合区别
7. 总结
-
序列
结构主要有列表、元组、集合、字典和字符串 -
正向递增索引取值范围[0,N-1],反向递减索引取值范围[-1,-N]
-
切片
操作语法结构:序列名[start: end :step] -
创建列表
的方式:1)使用“直接创建 2)使用内置函数list()创建列表的相关操作方法
-
添加方法:append()和insert()
-
删除方法:clear()、remove()、pop()
-
列表元素的排序:sort()和内置函数sorted()
-
其它方法:reverse()和copy()
-
-
创建元组的方式
:1)使用()直接创建 2)使用内置函数tuple()创建 -
创建字典的方式
:1)使用{}直接创建 2)使用内置函数dict()- 使用内置函数dict()创建字典的两种方式
-
通过映射函数zip(lst1,lst2)创建字典
-
通过给定关键字创建字典dict(key1=value1,key2=value2.....)
-
字典的相关操作方法!
-
查询方法:get()、keys()、values()和items()
-
删除方法:pop()、popitem()和clear()
-
- 使用内置函数dict()创建字典的两种方式
-
创建集合的方式
:1)使用{}直接创建2)使用内置函数set()创建集合的相关操作方法
-
添加方法:add()
-
删除方法:remove()和clear()
-
-
列表、字典、集合都是Python中的可变数据类型,元组是Python中的不可变数据类型
-
列表、元组、字典和集合的遍历都可以通过for循环实现
-
列表、元组、字典和集合的删除都可以使用语句 del来实现
8.练习
-
《一》
d={'a':10} d2=d d['a']=100 print(d['a']+d2['a']) 这个的输出结果?
点击查看代码
d={'a':10} d2=d d['a']=100 print(d['a']+d2['a']) # 200 d3 = d.copy() d['a']=200 print(d['a'] + d3['a']) # 300 # 这里d2 = d并不是创建了一个新的字典对象,而是让d2和d指向了同一个字典对象。换句话说,d和d2是同一个字典的两个引用。 d['a'] = 100 这一步修改了字典对象中键'a'对应的值为100。由于d和d2指向的是同一个字典对象,所以d2['a']也会被修改为100。 print(d['a'] + d2['a']) 此时d['a']和d2['a']的值都是100,因此d['a'] + d2['a']的结果是200。 d = {'a': 10} d2 = d.copy() copy方法来创建一个浅拷贝 d['a'] = 100 print(d['a'] + d2['a']) 这样d2就不会受到d的修改影响,结果将是110。
-
《二》
需求
:已知一个列表中存储的是员工的出生年份[88,89,90,98,00,99],由于时间比较久,出生的年份均为2位整数,现需要2位年份前加19,如果年份是00,将需要加上200点击查看代码
years = [88,89,90,98,00,99] for index in range(len(years)): if str(years[index]) != '0': years[index] = "19"+str(years[index]) else: years[index] = "20"+str(years[index]) print(years) -------------- years = [88,89,90,98,00,99] for index,value in enumerate(years): if str(value) != '0': years[index] = "19" + str(value) else: years[index] = "200" + str(value) print(years)
-
《三》 模拟京东购物流程
需求
:从键盘录入5个商品信息(1001手机)添加到商品列表中,展示商品信息,提示用户选择商品,用户选中的商品添加到购物车中(购物车中的商品要逆序)用户选中的商品不存在需要有相应提示当用户输入“q”时循环结束,显示购物车中的商品。点击查看代码
lst = [] stor = [] for i in range(5): goods = input("请输入商品编号及商品名称,进行入库,每次只能输入一尖商品:") lst.append(goods) for j in range(len(lst)): print(lst[j]) while True: flag = 0 a = input("请输入商品编号:") for item in lst: if a==item[0:4]: flag=1 print("succeed") stor.append(item) break #退出for循环 if flag==0 and a!='q': print('商品没找到') if a =="q": break print("-"*50) print("您选择的商品有:") stor.reverse() for item in stor: print(item)
-
《四》 模拟12306火车票订票流程
需求:假设北京到天津有4个车次可供选择,用户选择所要购买的车次,进行购票进站。
点击查看代码
d = { 'G1569':['北京南-天津南','18:06','18:39','00:33'], 'G1567':['北京南-天津南','18:15','18:49','00:34'], 'G8917':['北京南-天津西', '18:20', '19:19', '00:59'], 'G203':['北京南-天津南', '18:35', '19:09', '00:34'] } print('车次 ',' 出发站-到达站','出发时间','到达时间','历时时长') for key in d.keys(): print(key,end='\t') for item in d.get(key): print(item,end='\t') print() car= input("请输入购票车次:") info = d.get(car,"不存在") if info != "不存在": name = input("请输入乘车人,如果是多个乘车人请使用逗号分隔:") s = info[0] +" " +info[1] print("您购买的车次:" + car ,s+"开,请" + name + "尽快取票。【铁路客服】") else: print("车次不存在")
-
《五》 模拟手机通讯录
需求:从键盘录入5位好友的姓名和电话,由于通讯录是无序的所以可以使用集合来实现,点击查看代码
s = set() for i in range(1,6): # info = input("请输入第%d位好友的姓名及手机号:"% i) # info = input(f"请输入第{i}位好友的姓名及手机号:") info = input("请输入第{0}位好友的姓名及手机号:".format(i)) s.add(info) for item in s: print(item) ---- 结果: 请输入第1位好友的姓名及手机号:a1 请输入第2位好友的姓名及手机号:b2 请输入第3位好友的姓名及手机号:c3 请输入第4位好友的姓名及手机号:d4 请输入第5位好友的姓名及手机号:e5 e5 b2 a1 d4 c3
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人