python笔记-列表+元组+字典+集合

本篇文章非原创,几乎所有内容都来自:c语言中文网-Python列表(list)、元组(tuple)、字典(dict)和集合(set)详解

序列

字符串、列表、元组。

序列索引

正向:从左到右,0下标开始。

反向:从右到左,-1下标开始。

str = "Hello,world!"
print(str[0], str[-6]) # H w
print(str[5], str[-1]) # , !

序列切片

sname[start : end : step]

  • start:开始位置(包括该位置),默认为 0,可不写,从序列的开头进行切片;
  • end:结束位置(不包括该位置),如果不指定,默认为序列的长度;
  • step:隔几个存储位置(包含当前位置)取一次元素,若要设置 step 的值,必须写第二个:。
str = "Hello,world!"
print(str[:2])
print(str[::2])
print(str[:]) # 取整个字符串

结果:

He
Hlowrd
Hello,world!

列表

列表是序列的一种。

列表可以存储整数、小数、字符串、列表、元组等任何类型的数据。

同一个列表中元素的类型也可以不同。

创建列表

1、直接创建

num = [1, 2, 3, 4, 5, 6, 7]

2、list()创建

#将字符串转换成列表
list1 = list("hello")
print(list1)
#将元组转换成列表
tuple1 = ('Python', 'Java', 'C++', 'JavaScript')
list2 = list(tuple1)
print(list2)
#将字典转换成列表
dict1 = {'a':100, 'b':42, 'c':9}
list3 = list(dict1)
print(list3)
#将区间转换成列表
range1 = range(1, 6)
list4 = list(range1)
print(list4)
#创建空列表
print(list())

结果:

[‘h’, ‘e’, ‘l’, ‘l’, ‘o’]
[‘Python’, ‘Java’, ‘C++’, ‘JavaScript’]
[‘a’, ‘b’, ‘c’]
[1, 2, 3, 4, 5]
[]

访问列表元素

url = list("https://www.w3school.com.cn/python/python_strings.asp")
#索引访问 某个元素
print(url[3])  #使用正数索引
print(url[-4])  #使用负数索引
#切片访问 一组元素
print(url[9: 18])  #使用正数切片
print(url[9: 18: 3])  #指定步长
print(url[-6: -1])  #使用负数切片

结果:

p
.
[‘w’, ‘w’, ‘.’, ‘w’, ‘3’, ‘s’, ‘c’, ‘h’, ‘o’]
[‘w’, ‘w’, ‘c’]
[‘g’, ‘s’, ‘.’, ‘a’, ‘s’]

添加列表元素

1、+

language = ["Python", "C++", "Java"]
birthday = [1991, 1998, 1995]
info = language + birthday
print("info =", info) # info = ['Python', 'C++', 'Java', 1991, 1998, 1995]

2、append()

list = ['Python', 'C++', 'Java']
list.append('PHP')
print(list)

t = ('JavaScript', 'C#', 'Go')
list.append(t)
print(list)

list.append(['Ruby', 'SQL'])
print(list)

结果:

[‘Python’, ‘C++’, ‘Java’, ‘PHP’]
[‘Python’, ‘C++’, ‘Java’, ‘PHP’, (‘JavaScript’, ‘C#’, ‘Go’)]
[‘Python’, ‘C++’, ‘Java’, ‘PHP’, (‘JavaScript’, ‘C#’, ‘Go’), [‘Ruby’, ‘SQL’]]

可见,不管参数中有多少数据,append()都会将其视作一条数据插入list中。

3、extend()

与append()不同,extend()不会把列表或者元祖视为一个整体,而是把它们包含的元素逐个添加到列表中。

list = ['Python', 'C++', 'Java']
list.extend('PHP')
print(list)

t = ('JavaScript', 'C#', 'Go')
list.extend(t)
print(list)

list.extend(['Ruby', 'SQL'])
print(list)

插入列表元素

insert(index, element)方法仅将元素插入列表,没有返回值。

list=[1, 2, 3, 4, 5]
list.insert(3, 8) # [1, 2, 3, 8, 4, 5]

list.insert(10, 11) # 等价list.insert(6, 11)
print(list)  # [1, 2, 3, 8, 4, 5, 11]

list.insert(-1, 12)
print(list) # [1, 2, 3, 8, 4, 5, 12, 11]

修改列表元素

list = list("hello w")
list[2] = 'L' # 索引修改单个
print(list)

list[3:5] = "XYZ" # 切片修改一群
print(list)

结果:

[‘h’, ‘e’, ‘L’, ‘l’, ‘o’, ’ ', ‘w’]
[‘h’, ‘e’, ‘L’, ‘X’, ‘Y’, ‘Z’, ’ ', ‘w’]

查找列表元素

1、index()

listname.index(obj, start, end),返回obj在列表中第一次出现的位置。

  • start 和 end 可以都不写,检索整个列表;
  • 只写 start 不写 end,检索从 start 到末尾的元素;
  • start 和 end 都写,检索 start 和 end 之间的元素。
nums = [1, 2, 100, 4, 2, 6, 99, 1, 7, 3, 88, 2]
print(nums.index(2))
print(nums.index(99, 3, 7))
print(nums.index(7, 4))
print(nums.index(55))

1
6
8

ValueError: 55 is not in list

⚠️:当list中不存在obj时,会出现ValueError,所以查找之前最好count()一下。

2、count()

统计某个元素在列表中出现的次数。

list = [1, 2, 100, 4, 2, 6, 99, 1, 7, 3, 88, 2]
print("元素2出现了" + str(list.count(2)) + "次") # 元素2出现了3次

删除列表元素

1、del

lang = ["Python", "C++", "Java", "PHP", "Ruby", "MATLAB"]
del lang[2]
print(lang)

del lang[-2]
print(lang)

del lang[1: 3]
print(lang)

lang.extend(["SQL", "C#", "Go"])
del lang[-4: -2]
print(lang)

结果:

[‘Python’, ‘C++’, ‘PHP’, ‘Ruby’, ‘MATLAB’]
[‘Python’, ‘C++’, ‘PHP’, ‘MATLAB’]
[‘Python’, ‘MATLAB’]
[‘C#’, ‘Go’]

2、pop()

删除给定位置的值,如果没给,删除最后一位,类似栈,但没有对应的push(),可以用append、extend代替push。

nums = [1, 2, 3, 4, 5, 6, 7]
nums.pop(3)
print(nums)
nums.pop()
print(nums)

结果:

[1, 2, 3, 5, 6, 7]
[1, 2, 3, 5, 6]

3、remove()

删除某个固定的值,如果这个值有多个,则删除第一个。

nums = [1, 2, 3, 4, 5, 6, 6, 7, 8, 9, 10]
nums.remove(3)
print(nums)

nums.remove(6) # 6有两个
print(nums)

结果:

[1, 2, 4, 5, 6, 6, 7, 8, 9, 10]
[1, 2, 4, 5, 6, 7, 8, 9, 10]

4、清空列表

list.clear()

元组

元组可以存储整数、实数、字符串、列表、元组等任何类型的数据。

在同一个元组中,元素的类型可以不同。

元组(tuple)和列表(list)的不同之处在于:

  • 列表元素可修改,为可变序列,包括修改元素值,删除和插入元素;
  • 元组一旦被创建,元素不可修改,是不可变序列。

创建元组

1、直接创建

x = (1, 2, 3, 4, 5, 6)
y = ("Python", 19, [1, 2], {1: 2})
z1 = 'a', 'b', 'c' # 不写()时,有,分割的,按照元组处理
z2 = 'a' # 普通变量声明
z3 = ('a') # 普通变量声明
z4 = ('a',) # 元组
print(x)
print(y)
print(z1)
print(z2)
print(z3)
print(z4)

结果:

(1, 2, 3, 4, 5, 6)
(‘Python’, 19, [1, 2], {1: 2})
(‘a’, ‘b’, ‘c’)
a
a
(‘a’,)

2、tuple()创建

#将字符串转换成元组
tuple1 = tuple("hello")
print(tuple1)

#将列表转换成元组
list1 = ['Python', 'Java', 'C++', 'JavaScript']
tuple2 = tuple(list1)
print(tuple2)

#将字典转换成元组
dict1 = {'a':100, 'b':42, 'c':9}
tuple3 = tuple(dict1)
print(tuple3)

#将区间转换成元组
range1 = range(1, 6)
tuple4 = tuple(range1)
print(tuple4)

#创建空元组
print(tuple())

结果:

(‘h’, ‘e’, ‘l’, ‘l’, ‘o’)
(‘Python’, ‘Java’, ‘C++’, ‘JavaScript’)
(‘a’, ‘b’, ‘c’)
(1, 2, 3, 4, 5)
()

访问元组元素

url = tuple("https://www.w3school.com.cn/python/python_strings.asp")
#索引访问 某个元素
print(url[3])  #使用正数索引
print(url[-4])  #使用负数索引
#切片访问 一组元素
print(url[9: 18])  #使用正数切片
print(url[9: 18: 3])  #指定步长
print(url[-6: -1])  #使用负数切片

结果:

p
.
(‘w’, ‘w’, ‘.’, ‘w’, ‘3’, ‘s’, ‘c’, ‘h’, ‘o’)
(‘w’, ‘w’, ‘c’)
(‘g’, ‘s’, ‘.’, ‘a’, ‘s’)

修改元组元素

只能通过给tuple重新赋值、+拼接的形式修改元组元素。

url = tuple("hello")
url += ('!',)
print(url)

url = tuple("world")
print(url)

结果:

(‘h’, ‘e’, ‘l’, ‘l’, ‘o’, ‘!’)
(‘w’, ‘o’, ‘r’, ‘l’, ‘d’)

字典

字典,数据类型dict,以key:value(键值对)的形式存储,无序、可变。相当于Java、c++中的Map对象。

区分列表list、元组tuple:dict的元素在存储时无序,数据不占据连续的存储空间。

创建dict

1、直接声明:

dictname = {'key':'value1', 'key2':'value2', ...}

其中,dictname 表示字典变量名,key为键,value为对应的值,键和值之间使用冒号:分隔,相邻元素之间使用逗号,分隔,所有元素放在大括号{ }中。同一字典中的键必须唯一,不能重复

例:

scores = {'数学': 95, '英语': 92, '语文': 84}

⚠️:key可以是整数、字符串或者元组,value可以是python支持的任何数据类型。

2、list为参,赋初始值

list = ['语文', '数学', '英语']
scores = dict.fromkeys(list, 60)
print(scores) # {'语文': 60, '数学': 60, '英语': 60}

3、dict()函数赋初始值

方法一:dict() 函数参数:各自是包含 2 个元素的列表或元组,第一个元素为键,第二个元素为值。

# demo = [('two',2), ('one',1), ('three',3)]
# demo = [['two',2], ['one',1], ['three',3]]
# demo = (('two',2), ('one',1), ('three',3))
demo = (['two',2], ['one',1], ['three',3])
a = dict(demo)
print(a) # {'two': 2, 'one': 1, 'three': 3}

方法二:a = dict(str1=value1, str2=value2, str3=value3),使用此方式创建字典时,字符串不能带引号。

a = dict(two=2, one=1, three=3)
print(a) # {'two': 2, 'one': 1, 'three': 3}

⚠️:dict()创建空字典{}

访问字典

1、dictname[key]

dict = {'语文': 90, '数学': 80, '英语': 70}
print(dict['语文']) # 90

2、dictname.get(key[,default])

dict = {'语文': 90, '数学': 80, '英语': 70}
print(dict.get('语文'))
print(dict.get('计算机'))
print(dict.get('计算机', "您寻找的键不存在"))

结果:

90
None
您寻找的键不存在

增删改字典元素

  • key无法修改,可修改value
dict = {'语文': 90, '数学': 80, '英语': 70}

# 对已有数据赋值,修改
dict['语文'] = 99

# 对不存在数据赋值,新增
dict['计算机'] = 66
print(dict) # {'语文': 99, '数学': 80, '英语': 70, '计算机': 66}

# 通过key删除元素
del dict['计算机']
print(dict) # {'语文': 99, '数学': 80, '英语': 70}

删除字典元素,还有pop()、popitem()方法,甚至可以使用setdefault()在某些情况下增改键值对,见“常用字典方法”。

常用字典方法

keys()、values()、items()

  • keys() ,返回字典中的所有键(key)
  • values() ,返回字典中所有键对应的值(value)
  • items() ,返回字典中所有的键值对(key-value)
dict = {'语文': 90, '数学': 80, '英语': 70}
print(dict.keys())
print(dict.values())
print(dict.items())
print(dict)

结果:

dict_keys([‘语文’, ‘数学’, ‘英语’])
dict_values([90, 80, 70])
dict_items([(‘语文’, 90), (‘数学’, 80), (‘英语’, 70)])
{‘语文’: 90, ‘数学’: 80, ‘英语’: 70}

也可以这么用:

dict = {'语文': 90, '数学': 80, '英语': 70}

for key in dict.keys():
	print(key, end=" ") # 语文 数学 英语
for value in dict.values():
	print(value, end=" ") # 90 80 70 
for k,v in dict.items():
	print("{0}:{1}".format(k, v), end=" ") # 语文:90 数学:80 英语:70

copy()

copy()方法对最表层的键值对进行深拷贝(重新分配内存地址),对value值为列表等复合数据类型的拷贝为浅拷贝(共享内存地址),如下例子中,dict和dictC里的‘b’本质是列表,但复制后指向的仍是同一块内存区域。

dict = {'a':100, 'b':[1, 2, 3]}
list = [1, 2, 3, 4, 5]

dictC = dict.copy()
listC = list.copy()

print(dictC) # {'a': 100, 'b': [1, 2, 3]}
print(listC) # [1, 2, 3, 4, 5]

print(id(dict) == id(dictC)) # False
print(id(list) == id(listC)) # False
print(id(dict.get('b')) == id(dictC.get('b'))) # True

pop()、popitem()

  • pop()通过key删除,返回被删除的value
  • popitem()随机删除一条字典元素,一般遵循“出栈”原则,删除最后一个元素。返回值为被删除的键值对。
dict = {'语文': 90, '数学': 80, '英语': 70}

print(dict.pop("语文"))
print(dict)

print(dict.popitem())
print(dict)

结果:

90
{‘数学’: 80, ‘英语’: 70}

(‘英语’, 70)
{‘数学’: 80}

那么有没有一种情况,不必遍历整个字典,直接设置:key存在的话,其值不可改变,key不存在的话,添加指定的键值对呢?可以:

setdefault()

dict = {'语文': 90, '数学': 80, '英语': 70}
print(dict)

#key不存在,添加新键值对,给默认值
dict.setdefault('物理', 94)
print(dict)

#key不存在,添加新key,value没给时默认为None
dict.setdefault('化学')
print(dict)

#key存在,就不更改已有的value,默认值给了也没用
dict.setdefault('数学', 100)
print(dict)

结果:

{‘语文’: 90, ‘数学’: 80, ‘英语’: 70}
{‘语文’: 90, ‘数学’: 80, ‘英语’: 70, ‘物理’: 94}
{‘语文’: 90, ‘数学’: 80, ‘英语’: 70, ‘物理’: 94, ‘化学’: None}
{‘语文’: 90, ‘数学’: 80, ‘英语’: 70, ‘物理’: 94, ‘化学’: None}

集合

和字典类似,Python 集合会将所有元素放在一对大括号 {} 中,相邻元素之间用“,”分隔。

同一集合中,只能存储不可变的数据类型,包括整形、浮点型、字符串、元组,无法存储列表、字典这些可变数据类型。

同一集合中,数据必须唯一。

set 是无序的,每次输出时元素的顺序可能都不相同。

创建集合

1、直接创建

s = {1, 1, 2, 'a', (1, 2, 3)}
print(s)
print(type(s))

结果:

{1, 2, (1, 2, 3), ‘a’}
<class ‘set’>

2、set()创建

set1 = set("hello")
set2 = set([1,2,3,4,5])
set3 = set((1,2,3,4,5))
print("set1:",set1)
print("set2:",set2)
print("set3:",set3)

结果:

set1: {‘o’, ‘l’, ‘h’, ‘e’}
set2: {1, 2, 3, 4, 5}
set3: {1, 2, 3, 4, 5}

访问集合元素

因为set无序,所以无法通过访问位置等方式读取元素数据,只能遍历访问:

set1 = set("hello")
for e in set1:
	print(e)

修改集合元素

set1 = set("1122345")
set1.add('a') # 不能添加可变数据
print(set1)

set1.remove('1') # 移除不存在的元素时,会报KeyError
print(set1)

set1.discard("0")# 与remove()不同,不会报KeyError
print(set1)

# 非要向set中添加列表、字典元素使用
set1.update(['5', '6']) 
set1.update({'k':'v'})
print(set1)

结果:

{‘4’, ‘5’, ‘1’, ‘a’, ‘2’, ‘3’}
{‘4’, ‘5’, ‘a’, ‘2’, ‘3’}
{‘4’, ‘5’, ‘a’, ‘2’, ‘3’}
{‘4’, ‘5’, ‘k’, ‘a’, ‘6’, ‘2’, ‘3’}

交集、并集、差集、对称差集

操作运算符含义
交集&取两者都有的元素
并集|取两者合并后的所有元素,相同项保留一个
差集-例:a-b,取a中所有b里没有的元素
对称差集^取两者中所有不属于a&b的元素
a = {1, 2, 3}
b = {3, 4, 5}
print(a & b)
print(a | b)

print(a - b)
print(b - a)

print(a ^ b)

结果:

{3}
{1, 2, 3, 4, 5}
{1, 2}
{4, 5}
{1, 2, 4, 5}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值