前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用dict和set

使用dict和set

作者头像
紫禁玄科
发布2022-03-24 17:18:59
4580
发布2022-03-24 17:18:59
举报
文章被收录于专栏:紫禁玄科紫禁玄科

dict

描述

dict() 函数用于创建一个字典。

语法

dict 语法:

代码语言:javascript
复制
class dict(**kwarg)
class dict(mapping, **kwarg)
class dict(iterable, **kwarg)

参数说明:

  • **kwargs -- 关键字。
  • mapping -- 元素的容器,映射类型(Mapping Types)是一种关联式的容器类型,它存储了对象与对象之间的映射关系。
  • iterable -- 可迭代对象。

List是python中的基本数据结构之一,和Java中的ArrayList有些类似,支持动态的元素的增加。list还支持不同类型的元素在一个列表中,

Python内置字典:dict的支持,dict全称dictionary,在其他语言也称为map,使用键-值(key-value)存储,具有极快的查询速度。

举个例子,假设要根据同学的名字查询对应的成绩,如果用list实现,需要两个list:

代码语言:javascript
复制
names = ['Michael','Bob','Tracy']
scores = ['95','75','85']
names

给定一个名字,要查询对应的成绩,就先要在names中找到对应的位置,再从scores取出对应的成绩,list越长,耗时越长。

如果用dict实现,只需要一个“名字”-“成绩”的对照表,直接根据名字查询成绩,无论这个表有多大,查询速度都不会变慢。

代码语言:javascript
复制
d = {'Michael':95,'Bob':'75','Tracy': 85}
d['Michael']

为什么dict查找速度这么快?因为dict的实现原理和查字典是一样的。假设字典包含了1万个汉子,我们要某一个字,一个办法是把字典从第一页往后翻,直到找到我们想要的字为止,这种方法就是在list中查找元素的方法,list越大,查询越慢。

第二种方法是先在字典的索引表里(比如部首表)查这个字对应的页码,然后直接翻到该页,找到这个字。无论找那个字,这种查询速度非常快,不会随着字典大小的增加而变慢。

ditc就是第二种实现方式,给定一个名字,比如'Michael',dict的内部就可以直接计算出Michael对应的存放成绩的“页码”,也就是95这个数字存放的内存地址,直接取出来,所以速度非常快。

你可以猜到,这种key-value存储方式,在放进去的时候,必须根据key算出value的存放位置,这样,取得时候才能根据key直接拿到value。

把数据放入dict的方法,除了初始化时指定外,还可以通过key放入:

代码语言:javascript
复制
d['Adam'] = 67
d['Adam']

由于一个key只能对应一个value,所以,多次一个key放入value,后面的值会把前面的值冲掉:

代码语言:javascript
复制
d['Jack'] = 90
d['Jack']

d['Jack'] = 88
d['Jack']

如果key不存在,dict就会报错:

要避免key不存在的错误,有两种办法,一是通过in哦按段key是否存在:

代码语言:javascript
复制
'Thomas' in d

二是通过dict提供get()方法,如果key不存在,可以返回None,或者自己指定的value:

代码语言:javascript
复制
d.get('Thomas')
d.get('Thomas',-1)

注意:返回None的时候Python的交互环境不显示结果。

要删除一个key,用pop(key)方法,对应的value也会从dict中删除:

代码语言:javascript
复制
d.pop('Bob')
75
d
{'Michael': 95, 'Tracy': 85}

dict内部存放弟弟顺序和key放入的顺序是没有关系的。

和list比较,dict有以下几个特点:

1,查找和插入的速度极快,不会随着key的增加而变慢,

2,需要占用大量的内存,内存浪费多。

而list相反:

1,查找和插入的时间随着元素的增加而增加。

2,占用空间小,浪费内存少。

所以,dict是用空间来换取时间的一种方法。

dict可以同在需要高速查找的很多地方,在python代码中几乎无处不在,正确使用dict非常重要,需要牢记的第一条就是dict的key必须是不可变对象。

这是因为dict根据key来计算value的存储位置,如果每次计算相同的key得出的结果不同,那dict内部就完全混乱了,这个通过key计算位置的算法称为哈希算法(Hash)

要保证hash的正确性,作为key的对象就不能便。在python中,字符串,整数等都是不可变的,因此,可以放心地作为key,而list是可变的,就不能作为key:

代码语言:javascript
复制
dict()                        # 创建空字典
{}
dict(a='a', b='b', t='t')     # 传入关键字
{'a': 'a', 'b': 'b', 't': 't'}
dict(zip(['one', 'two', 'three'], [1, 2, 3]))   # 映射函数方式来构造字典
{'three': 3, 'two': 2, 'one': 1} 
dict([('one', 1), ('two', 2), ('three', 3)])    # 可迭代对象方式来构造字典
{'three': 3, 'two': 2, 'one': 1}

只使用关键字参数创建字典

代码语言:javascript
复制
numbers = dict(x=5, y=0)
print('numbers =', numbers)
print(type(numbers))

empty = dict()
print('empty =', empty)
print(type(empty))

使用可迭代对象创建字典

代码语言:javascript
复制
# 没有设置关键字参数
numbers1 = dict([('x', 5), ('y', -5)])
print('numbers1 =',numbers1)

# 设置关键字参数
numbers2 = dict([('x', 5), ('y', -5)], z=8)
print('numbers2 =',numbers2)

# zip() 创建可迭代对象
numbers3 = dict(dict(zip(['x', 'y', 'z'], [1, 2, 3])))
print('numbers3 =',numbers3)

使用映射来创建字典

映射类型(Mapping Types)是一种关联式的容器类型,它存储了对象与对象之间的映射关系。

代码语言:javascript
复制
numbers1 = dict({'x': 4, 'y': 5})
print('numbers1 =',numbers1)

# 以下代码不需要使用 dict()
numbers2 = {'x': 4, 'y': 5}
print('numbers2 =',numbers2)

# 关键字参数会被传递
numbers3 = dict({'x': 4, 'y': 5}, z=8)
print('numbers3 =',numbers3)

------------------------------------------------------------------------------set

描述

set 和 dict 类似,也是一组 key 的集合,但是不存储 value. 由于 key 不重复,所以,在 set 中, 没有重复的 key 集合是可变类型:

set() 函数创建一个无序不重复元素集,可进行关系测试,删除重复数据,还可以计算交集、差集、并集等。

语法

set 语法:

代码语言:javascript
复制
class set([iterable])

参数说明:

  • iterable -- 可迭代对象对象; 注意:创建一个空集合必须用 set( ) 而不是 { } ,因为 { } 是用来创建一个空字典

set和dict类似,也是一组key组合,但不能存储value。由于key不能重复,所以早set中,没有重复的key。

要创建一个set,需要提供一个list作为输出集合“

代码语言:javascript
复制
s = set([1,2,3])
s

注意,传入参数[1,2,3]是一个;list,而显示的{1,2,3}只是告诉你这个set内部有1,2,3这3个元素,显示的顺序也不表示set是有序的。

重复元素在set中自动被过滤:

代码语言:javascript
复制
s = set({1,1,2,2,3,3})
s

通过add(key)方法可以添加元素到set中,可以重复添加,但不会有效果:

代码语言:javascript
复制
s.add(4)
s

通过remove(key)方法可以删除元素:

代码语言:javascript
复制
s.remove(4)
s

set可以看成数学意义上的无序和无重复元素的集合,因此,两个set可以做数学意义上的交集,并集等操作:

代码语言:javascript
复制
s1 = set([1,2,3])
s2 = set([2,3,4])
s1 & s2

s1 | s2

set和dict的唯一区别仅在于没有存储对应的value,但是,set的原理和dict一样,所以,同样不可以放入可变对象,因为无法判断两个可变对象是否相等,也就无法保证set内部“不会有重复元素”。试试把list放入set,看看是否会报错。

str是不变对象,而lits是可变对象

对于可变对象,比如list,对list进行操作,list内部弟弟内容是会变化的,不如:

代码语言:javascript
复制
a = ['c','b','a']
a.sort()
a

而对于不可变对象,比如str,对str进行操作

代码语言:javascript
复制
a = 'abc'
a.replace('a','A')

a

虽然字符串有个replace()方法,也确实变出了'Abc',但变量a最后还是'abc',一个如何去理解嘞!

代码语言:javascript
复制
a = 'abc'
b = a.replace('a','A')
b

a

要记住的是a是变量,而'abc'才是字符串对象!有些时候,我们经常说,对象a的内容说'abc',但其实是指,本身是一个变量,它指向的对象的内容才是'abc':

当我们调用a.replace('a','A')时,实际调用方法replace是作用在字符串对象'abc'上的,而这个方法虽然名字叫replace,但却没有改变字符串'abc'的内容。相反,replace方法创建了一个新字符串'Abc'并返回,如果我们用变量b指向该字符串,就容易理解了,变量a指向原有的字符串'abc',但变量b却指向字符串'Abc'了:

所以,对于不变对象来说,调用对象自身的任意方法,也不会改变该对象自身的内容。相反,这些方法会创建新的对象并返回,这样,就保证了不可变对象本身永远是不可变的。

小结

使用key-value存储结构的dict在Python中非常有用,选择不可变对象作为key很重要,最常用的key是字符串。

代码语言:javascript
复制

  x = set('runoob')
  y = set('google')
x, y
(set(['b', 'r', 'u', 'o', 'n']), set(['e', 'o', 'g', 'l']))   # 重复的被删除
  x & y         # 交集
set(['o'])
  x | y         # 并集
set(['b', 'e', 'g', 'l', 'o', 'n', 'r', 'u'])
  x - y         # 差集
set(['r', 'b', 'u', 'n'])

Python内置的函数

内置函数

abs()

divmod()

input()

open()

staticmethod()

all()

enumerate()

int()

ord()

str()

any()

eval()

isinstance()

pow()

sum()

basestring()

execfile()

issubclass()

print()

super()

bin()

file()

iter()

property()

tuple

bool()

filter()

len()

range()

type()

bytearray()

float()

list()

ram input()

unichr()

callable()

format()

locals()

reduce()

unicode()

chr()

frozenset()

long()

reload()

vars()

classmethod()

getattr()

map()

repr()

xrange()

cmp()

globals()

max()

reverse()

zip()

compile()

hasattr()

memoryview()

round()

import()

complex()

hash()

min()

set()

delattr()

help()

next()

setattr()

dict()

hex()

obhect()

slice()

dir()

id()

oct()

sorted()

exec内置表达式

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-03-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 紫禁玄科 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 描述
  • 语法
    • 只使用关键字参数创建字典
      • 使用可迭代对象创建字典
        • 使用映射来创建字典
        • 描述
        • 语法
          • 小结
          相关产品与服务
          对象存储
          对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档