带你走进 @ 机器人时代
Discover 点击上面蓝色文字,关注我们
Python序列除了列表外,还有元组、字典、集合等序列结构,他们各有不同的功能和应用,今天我们来看看。
元组相当于是不可变的列表,一旦创建就不能修改。
o=(3,'abc',[1,2,3])
print(o[1])
o[1]=999
print(o)
运行结果:
abc
Traceback (most recent call last):
File "F:Python程序元组,字典,集合示例.py", line 9, in
o[1]=999
TypeError: 'tuple' object does not support item assignment
元组创建的方法一:
#创建元组,如果只有一个元素,需要加上逗号
p=(3,)
q=(3)
o=(3,'abc',[1,2,3])
print(type(p))
print(type(q))
print(type(o))
运行结果:
元组创建的方法二:
使用tuple()函数创建或转换为元组:
#使用tuple()函数创建元组
p=tuple('ABC')
print(type(p))
q=tuple([1,2,3,4,'5'])
print(type(q),'
',q)
o=tuple(range(1,5))
print(type(q),'
',o)
运行结果:
(1, 2, 3, 4, '5')
(1, 2, 3, 4)
访问元组的方法和访问列表的方法大同小异,可以通过索引号、切片的方式访问。
如果希望修改元组的元素,只能通过创建一个新的元组的方式来实现。所以,可以把元组理解为只读版的列表。
通过下面的代码,我们可以看出元组和列表的区别:
#元组和列表的区别
#测试内存占用
p=[]
print('列表的存储空间:',p.__sizeof__())
q=()
print('元组的存储空间:',q.__sizeof__())
运行结果:
列表的存储空间:40
元组的存储空间:24
字典:是一种无序的、可变的序列,它的元素以“键值对(key-value)”的形式存储。如:{1:'abc',2:'efg'}这种形式,1是键,abc是键值。
它主要有这些特征:键是唯一的,不能重复;键不可变,只能使用数字、字符串或者元组,不能使用列表;字典是可变的,可以任意嵌套;字典是任意数据的无序集合;通过键来读取数据,而不是通过索引。
我们来看看下面几种创建字典的方式:
#字典的创建
p={1:'abc',2:'efg'}
print(p,type(p))
m=dict.fromkeys(['张三','李世','王五'],60)
print(m,type(m))
n=dict(a='手机',b='电脑')
print(n,type(n))
d = (['two',2], ['one',1], ['three',3])
a = dict(d)
print(a,type(a))
运行结果:
{1: 'abc', 2: 'efg'}
{'张三': 60, '李世': 60, '王五': 60}
{'a': '手机', 'b': '电脑'}
{'two': 2, 'one': 1, 'three': 3}
访问字典的方式有两种:
#访问字典
p={'two': 99999, 'one': 88888, 'three': 3}
print(p['one'])
print(p.get('one'))
运行结果:
88888
88888
通过以下代码,我们看看对字典的增删改查的操作:
#访问字典
p={'two': 99999, 'one': 88888, 'three': 3}
#增加一堆键及键值
p['three']=77777
print(p)
#修改键及键值
p['three']=66666
print(p)
#删除键及键值
del p['three']
print(p)
#判断键是否存在
print('two' in p)
print('four' in p)
运行结果:
{'two': 99999, 'one': 88888, 'three': 77777}
{'two': 99999, 'one': 88888, 'three': 66666}
{'two': 99999, 'one': 88888}
True
False
获取字典中特定的数据,我们还可以使用下列方法:
keys() 方法用于返回字典中的所有键(key);
values() 方法用于返回字典中所有键对应的值(value);
items() 用于返回字典中所有的键值对(key-value);
p={'two': 99999, 'one': 88888, 'three': 3}
print(p.keys()) #取得键
print(p.values()) #取得键值
print(p.items()) #取得键值对
运行结果:
dict_keys(['two', 'one', 'three'])
dict_values([99999, 88888, 3])
dict_items([('two', 99999), ('one', 88888), ('three', 3)])
#注意返回值的类型
如果要操作这些返回值,需要转换为列表:
p={'two': 99999, 'one': 88888, 'three': 3}
print(p.keys()) #取得键
#注意返回值的类型
s=list(p.keys())
print(s,type(s))
运行结果:
dict_keys(['two', 'one', 'three'])
['two', 'one', 'three']
我们也可以使用循环来遍历字典:
p={'two': 99999, 'one': 88888, 'three': 3}
for i,j in p.items():
print(i,j)
运行结果:
two 99999
one 88888
three 3
copy()方法:
#copy()方法
a = {'one': 1, 'two': 2, 'three': [1,2,3]}
b = a.copy()
#向 a 中添加新键值对,由于b已经提前将 a 所有键值对都深拷贝过来
# 因此 a 添加新键值对,不会影响 b。
a['four']=100
print(a)
print(b)
#由于 b 和 a 共享[1,2,3](浅拷贝)
# 因此移除 a 中列表中的元素,也会影响 b。
a['three'].remove(1)
print(a)
print(b)
运行结果:
{'one': 1, 'two': 2, 'three': [1, 2, 3], 'four': 100}
{'one': 1, 'two': 2, 'three': [1, 2, 3]}
{'one': 1, 'two': 2, 'three': [2, 3], 'four': 100}
{'one': 1, 'two': 2, 'three': [2, 3]}
update()方法:
#update方法
a = {'one': 1, 'two': 2, 'three': 3}
a.update({'one':9, 'four': 12})
print(a)
运行结果:
{'one': 9, 'two': 2, 'three': 3, 'four': 12}
pop() 和 popitem() 方法:删除键值对
#pop() 和 popitem() 方法删除键值对
a = {'数学': 100, '语文': 99, '英语': 80}
print(a)
a.pop('语文')
print(a)
a.popitem()
print(a)
运行结果:
{'数学': 100, '语文': 99, '英语': 80}
{'数学': 100, '英语': 80}
{'数学': 100}
popitem() 总是弹出底层中的最后一个 key-value,这和列表的 pop() 方法类似。
setdefault() 方法用来返回某个 key 对应的 value;如果该 key 存在,那么直接返回该 key 对应的 value;
如果该 key 不存在,那么先为该 key 设置默认值,然后再返回该 key 对应的 默认值。
字典可以用来格式化字符串,我们来看看它的应用:
#使用字典格式化字符串
# 字符串模板中使用key
t = '我们国家%(a1)s, 有%(a2).0f年的历史,拥有人口:%(a3)s'
c = {'a1':'自古以来', 'a2': 5000, 'a3': '14亿'}
# 使用字典为字符串模板中的key传入值
print(t % c)
运行结果:
我们国家自古以来, 有5000年的历史,拥有人口:14亿
集合:与数学中的集合概念一样,用来保存不重复的元素,所有的元素都是唯一的。
同一集合中,只能存储不可变的数据类型,包括整形、浮点型、字符串、元组,无法存储列表、字典、集合这些可变的数据类型。
可以用{}和set()方法来创建集合,它最实用的特点就是用来过滤重复的数据。一般来说,由于集合是无序的,所有我们在访问集合的时候采用循环的方式来读取数据。
通过代码,我们可以看到集合操作的一些方法:
#集合的操作
p={1,2,3,4,6,7,7,8,9,9,0}
#集合会自动删除重复的元素
print(p,type(p))
#向集合中添加元素
p.add('ABC')
print(p,type(p))
#从集合中删除元素
p.remove(9)
print(p,type(p))
#使用discard()删除元素,失败不会报错
p.discard('ABD')
print(p,type(p))
q={3,4,5,999,'ABC','CD'}
#集合的交集运算
print(p&q)
#集合的并集运算
print(p|q)
#集合的差集运算
# 取一个集合中另一集合没有的元素
print(p-q)
#取集合 A 和 B 中不属于 A&B 的元素
print(p^q)
运行结果:
{0, 1, 2, 3, 4, 6, 7, 8, 9}
{0, 1, 2, 3, 4, 'ABC', 6, 7, 8, 9}
{0, 1, 2, 3, 4, 'ABC', 6, 7, 8}
{0, 1, 2, 3, 4, 'ABC', 6, 7, 8}
{'ABC', 3, 4}
{0, 1, 2, 3, 4, 'ABC', 6, 7, 8, 5, 999, 'CD'}
{0, 1, 2, 6, 7, 8}
{0, 1, 5, 2, 6, 7, 8, 'CD', 999}
下面总结集合的一些方法:
方法名 | 语法格式 | 功能 |
add() | set1.add() | 向 set1 集合中添加数字、字符串、元组或者布尔类型 |
clear() | set1.clear() | 清空 set1 集合中所有元素 |
copy() | set2 = set1.copy() | 拷贝 set1 集合给 set2 |
difference() | set3= set1.difference(set2) | 将 set1 中有而 set2 没有的元素给 set3 |
difference_update() | set1.difference_update(set2) | 从 set1 中删除与 set2 相同的元素 |
discard() | set1.discard(elem) | 删除 set1 中的 elem 元素 |
intersection() | set3= set1.intersection(set2) | 取 set1 和 set2 的交集给 set3 |
intersection_update() | set1.intersection_update(set2) | 取 set1和 set2 的交集,并更新给 set1 |
isdisjoint() | set1.isdisjoint(set2) | 判断 set1 和 set2 是否没有交集,有交集返回 False;没有交集返回 True |
issubset() | set1.issubset(set2) | 判断 set1 是否是 set2 的子集 |
issuperset() | set1.issuperset(set2) | 判断 set2 是否是 set1 的子集 |
pop() | a = set1.pop() | 取 set1 中一个元素,并赋值给 a |
remove() | set1.remove(elem) | 移除 set1 中的 elem 元素 |
symmetric_difference() | set3= set1.symmetric_difference(set2) | 取 set1 和 set2 中互不相同的元素,给 set3 |
symmetric_difference_update() | set1.symmetric_difference_update(set2) | 取 set1 和 set2 中互不相同的元素,并更新给 set1 |
union() | set3 = set1.union(set2) | 取 set1 和 set2 的并集,赋给 set3 |
update() | set1.update(elem) | 添加列表或集合中的元素到 set1 |
在Python中还有一种frozenset 集合是不可变序列,程序不能改变序列中的元素。
# frozenset 集合
t = {'张三', '李四', '王五'}
f = frozenset(['男', '女'])
b = {'1班', '2班'}
#向set集合中添加
t.add(f)
print('t =', t)
运行结果:
t = {frozenset({'男', '女'}), '李四', '王五', '张三'}
字典和集合是进行过性能高度优化的数据结构,特别是对于查找、添加和删除操作。
我们通过以下例子可以发现集合与列表在实际应用中的效率对比:
#初始化1万个产品的名称和价格
#分别用集合和列表来统计产品的价格数量
#计算耗时
#统计时间需要用到 time 模块中的函数
import time
def find_11(pd):
p_list = []
for _, price in pd: # A
if price not in p_list: #B
p_list.append(price)
return len(p_list)
id = [x for x in range(0, 10000)]
price = [x for x in range(20000, 30000)]
pd = list(zip(id, price))
# 计算列表版本的时间
开始时间 = time.perf_counter()
find_11(pd)
结束时间 = time.perf_counter()
print("列表总共用时: {}".format(结束时间 - 开始时间))
#使用集合完成同样的工作
def find_s(pd):
u_set = set()
for _, price in pd:
u_set.add(price)
return len(u_set)
# 计算集合版本的时间
开始时间1 = time.perf_counter()
find_s(pd)
结束时间1 = time.perf_counter()
print("集合总共用时: {}".format(结束时间1 - 开始时间1))
运行结果:
列表总共用时: 0.47609080000074755
集合总共用时: 0.0010524000008445
可见,Python序列的类型,各有各的用处
坚持学习,每天都能进步一点点!!
往期回顾:
本文引用和摘录相关内容,请联系侵删。
- END -
最后,文章有帮助到你的话【点赞在看】
激励我们分享更多的干货!
页面更新:2024-05-14
本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828
© CopyRight 2008-2024 All Rights Reserved. Powered By bs178.com 闽ICP备11008920号-3
闽公网安备35020302034844号