草庐IT

字典(dict)

思必得_22 2023-04-16 原文

4.7 字典(dict)

字典是Python中一种非常重要的数据类型。字典和之前的列表、元组不同,里面的元素使用键-值对进行存储。通常字典中元素的由字符串或数字等可哈希数据类型组成。
可以把字典想象成一个集合,只不过每个元素都是由键-值对组成。字典中的元素的键是不能重复的。字典中的元素也是无序的,这点和集合一样。
可以通过键获取集合中元素的值,并且速度要远快于列表。这种速度上的差异在数据量特别大时更加明显。

4.7.1 字典的创建

4.7.1.1 通过字典标识符号创建

列表在创建的时候用{}做标识。内部的元素用逗号进行分隔。注意:字典和集合都是用{}做标识的。
>>> dct1 = {} # 空字典
>>> dct2 = {'a': 1, 'b': 2} # 字典中存放了2个元素
>>> dct3 = {'小明': 20, '小芳': 18} # 字典中存放了2个元素
>>> dct4 = {[1]: 2} # 尝试用不可哈希数据类型(列表)作为键导致报错

Traceback (most recent call last):
File "C:\Program Files\Python3102\lib\code.py", line 90, in runcode
exec(code, self.locals)
File "", line 1, in
TypeError: unhashable type: 'list'

4.7.1.2 通过字典推导式创建

>>> dct = {i: i ** 2 for i in range(3)}
>>> dct

4.7.1.3 通过dict函数创建

>>> dict() # 空字典
>>> dict(a='a', b='b', c='c') # 通过关键字创建字典
>>> dict(zip(['one', 'two'], [1, 2])) # 通过映射函数方式创建字典
>>> dict([('one', 1), ('two', 2)]) # 通过可迭代对象创建字典

4.7.2 字典的访问

4.7.2.1 通过访问

>>> dct = {'one': 1, 'two': 2, 'three': 3}
>>> dct['two']

2

>>> dct['zero'] # 如果不存在,则会报错

Traceback (most recent call last):
File "C:\Program Files\Python3102\lib\code.py", line 90, in runcode
exec(code, self.locals)

4.7.2.2 遍历字典

参见可迭代对象的遍历
注意:遍历字典和其它遍历可迭代对象有所区别,遍历字典所得到的是字典的所有的元素的

dct = {'one': 1, 'two': 2, 'three': 3}
for i in dct:
	print(i)

one
two
three

4.7.2.3 成员资格检查

参见可迭代对象中的成员资格检查
注意:成员资格检查和其它可迭代对象有所区别,对于字典,是判断某个成员是否是字典的某个元素的

dct = {'one': 1, 'two': 2, 'three': 3}
print('one' in dct)
print('zero' in dct)

True
False

4.7.3 字典的修改

4.7.3.1 单个元素的修改

>>> dct = {'one': 1, 'two': 2, 'three': 3}
>>> dct['two'] = 22
>>> dct['two']

22

4.7.3.2 通过|得到更新后的字典

>>> dct = {'one': 1, 'two': 2, 'three': 3}
>>> dct2 = {'zero': 0, 'two': 22}
>>> dct3 = dct | dct2
>>> dct3

4.7.3.3 通过|=原地更新字典

>>> dct = {'one': 1, 'two': 2, 'three': 3}
>>> dct2 = {'zero': 0, 'two': 22}
>>> dct |= dct2
>>> dct

4.7.3.4 通过解包方式得到更新后的字典

>>> dct = {'one': 1, 'two': 2, 'three': 3}
>>> dct2 = {'zero': 0, 'two': 22}
>>> dct3 = {**dct, **dct2}
>>> dct3

4.7.4 字典的删除

4.7.4.1 删除某个元素

>>> dct = {'one': 1, 'two': 2, 'three': 3}
>>> del dct['two']
>>> dct['two'] # 删除元素后再次访问则会报错

Traceback (most recent call last):
File "C:\Program Files\Python3102\lib\code.py", line 90, in runcode
exec(code, self.locals)
File "", line 1, in
KeyError: 'two'

4.7.4.2 删除整个字典

>>> dct = {'one': 1, 'two': 2, 'three': 3}
>>> del dct
>>> dct # 删除字典后再次访问则会报错

Traceback (most recent call last):
File "C:\Program Files\Python3102\lib\code.py", line 90, in runcode
exec(code, self.locals)
File "", line 1, in
NameError: name 'dct' is not defined. Did you mean: 'dct1'?

4.7.5 字典的方法

4.7.5.1 添加元素

4.7.5.1.1 dict.update(dict2)

描述
把字典dict2的键/值对更新到dict里
示例
>>> dct = {'one': 1, 'two': 2, 'three': 3}
>>> dct2 = {'zero': 0, 'two': 22}
>>> dct.update(dct2)
>>> dct

4.7.5.2 删除元素

4.7.5.2.1 clear()

描述
清空字典(删除字典中所有的元素)
示例
>>> dct = {'one': 1, 'two': 2, 'three': 3}
>>> dct.clear()
>>> dct

{}

4.7.5.2.2 pop(key[,default])

描述
返回并删除字典中key这个键对应的值,如果键不存在,则返回default作为提示信息,如果没有设置default,则会引发KeyError异常。
示例
>>> dct = {'one': 1, 'two': 2, 'three': 3}
>>> dct.pop('one')

1

>>> dct

>>> dct.pop('zero', '没有这个key')

'没有这个key'

>>> dct.pop('zero')

Traceback (most recent call last):
File "C:\Program Files\Python3102\lib\code.py", line 90, in runcode
exec(code, self.locals)
File "", line 1, in
KeyError: 'zero'

4.7.5.2.3 popitem()

描述
返回并删除字典中的最后一对键和值。
示例
>>> dct = {'one': 1, 'two': 2, 'three': 3}
>>> dct.popitem()

('three', 3)

>>> dct

4.7.5.3 查询统计类

4.7.5.3.1 get(key, default=None)、setdefault(key, default=None)

描述
返回(设置)指定键的值,如果键不在字典中返回(设置)default设置的默认值。
示例
>>> dct = {'one': 1, 'two': 2, 'three': 3}
>>> dct.get('one')
>>> dct.get('zero')
>>> dct.get('zero', 0)

1
None
0

注意:
1、如果指定的存在,则get或者setdefault都是获取到这个的值。
2、如果指定的不存在,则get直接返回default指定的值。而setdefault不但返回default指定的值还会修改字典的内容。
示例
>>> dct = {'one': 1, 'two': 2, 'three': 3}
>>> dct.get('zero', 0)

0

>>> dct

>>> dct.setdefault('zero', 0)

0

>>> dct

4.7.5.3.2 keys()、values()

描述
返回字典所有的(值),注意返回的结果是dict_keys和dict_values类型的数据。可以通过for循环获取里面的元素,也可以通过list或者tuple转换成列表或元组。
示例
>>> dct = {'one': 1, 'two': 2, 'three': 3}
>>> dct.keys()

dict_keys(['one', 'two', 'three'])

4.7.5.3.3 items()

描述
返回字典所有的键-值,注意返回的结果是dict_items类型的数据。可以通过for循环获取里面的元素,也可以通过list或者tuple转换成列表或元组。
示例
>>> dct = {'one': 1, 'two': 2, 'three': 3}
>>> dct.items()

dict_items([('one', 1), ('two', 2), ('three', 3)])

4.7.5.4 其它类

4.7.5.4.1 copy()

描述
返回一个字典的浅复制
示例
>>> dct = {'one': 1, 'two': 2, 'three': 3}
>>> dct2 = dct.copy()
>>> dct2

4.7.5.4.2 fromkeys(seq, val)

描述
创建一个新的字典,以序列seq中元素做字典的键,val为字典所有键对应的初始值,如果没有提供val则所有键的值默认为None。
示例
>>> dct = {'one': 1, 'two': 2, 'three': 3}
>>> dct2 = dct.fromkeys('abc')
>>> dct3 = dct.fromkeys('abc', 123)
>>> dct2
>>> dct3

4.7.6 字典的应用

4.7.6.1 将字符串格式设置功能用于字典

在之前的学习中,我们知道了可以通过format的方式对字符串进行格式化。这里介绍一种更加简单易用的方式,那就是通过format_map来实现对字符串的格式化。
format_map可以让我们通过一个字典映射来对字符串进行格式化。
>>> phonebook = {'Beth': '9102', 'Alice': '2341', 'Cecil': '3258'}
>>> "Cecil's phone number is {Cecil}.".format_map(phonebook)

"Cecil's phone number is 3258."

在模板系统中,这种字符串格式设置方式很有用(下面的示例使用的是HTML)。
>>> template = '''
>>> ... {title}
>>> ...
>>> ...

{title}


>>> ...

{text}


>>> ... '''
>>> data = {'title': 'My Home Page', 'text': 'Welcome to my home page!'}
>>> template.format_map(data)

<html> <head><title>My Home Page</title></head> <body> <h1>My Home Page</h1> <p>Welcome to my home page!</p> </body>

4.7.6.2 字典排序

字典其实是一种无序的数据,但是有时候又希望字典能够按照一定的顺序一遍我们能够输出或者查看。这时就需要对字典进行排序了。

4.7.6.2.1 根据key排序
dct = {'one': 1, 'two': 2, 'three': 3}
for k in sorted(dct):
    print(k, dct[k])

one 1
three 3
two 2

4.7.6.2.2 根据value排序
dct = {'one': 1, 'two': 2, 'three': 3, 'zero': 0}
for k in sorted(dct, key=dct.__getitem__):
    print(k, dct[k])

zero 0
one 1
two 2
three 3

有关字典(dict)的更多相关文章

  1. 微信小程序通过字典表匹配对应数据 - 2

    前言一般来说,前端根据后台返回code码展示对应内容只需要在前台判断code值展示对应的内容即可,但要是匹配的code码比较多或者多个页面用到时,为了便于后期维护,后台就会使用字典表让前端匹配,下面我将在微信小程序中通过wxs的方法实现这个操作。为什么要使用wxs?{{method(a,b)}}可以看到,上述代码是一个调用方法传值的操作,在vue中很常见,多用于数据之间的转换,但由于微信小程序诸多限制的原因,你并不能优雅的这样操作,可能有人会说,为什么不用if判断实现呢?但是if判断的局限性在于如果存在数据量过大时,大量重复性操作和if判断会让你的代码显得异常冗余。wxswxs相当于是一个独立

  2. python - 将 Ruby 哈希字符串转换为 Python 字典 - 2

    我正在处理一些作为Ruby哈希字符串返回的命令输出。(来自名为mcollective的东西)。这是我收到的示例字符串:{:changes=>{"total"=>0},:events=>{"failure"=>0,"success"=>0,"total"=>0},:version=>{"puppet"=>"2.7.21(PuppetEnterprise2.8.1)","config"=>1381497648},:time=>{"filebucket"=>0.000287,"cron"=>0.00212,"package"=>0.398982,"exec"=>0.001314,"confi

  3. ruby - Ruby 字符串字典中的快速模糊/近似搜索 - 2

    我有一个包含50K到100K字符串的字典(最多可以包含50个以上的字符),我正在尝试查找给定字符串是否在具有“编辑”距离公差的字典中。(例如Levenshtein)。在进行搜索之前,我可以预先计算任何类型的数据结构。我的目标是尽快针对该字典运行数千个字符串并返回最近的邻居。如果有一个明显更快的算法,我会得到一个bool值来说明给定的是否在字典中为此,我首先尝试计算所有Levenshtein距离并取最小值,这显然非常慢。所以我尝试根据这篇文章实现一个LevenshteinTriehttp://stevehanov.ca/blog/index.php?id=114在这里查看我的重现基准的要

  4. ruby - 字典=哈希? - 2

    字典基本上只是一个哈希表吗?还有一个好处:在Ruby代码“Hash.new{0}”中,末尾的“{0}”是什么意思? 最佳答案 table、dictionary和map这三个词通常作为同义词使用(在数据结构的上下文中)。哈希表/HashMap是一种表/字典/图。{0}是一个忽略其参数并返回数字0的block(匿名函数)。调用提供给Hash.new的block以生成一个在HashMap中找不到键时的默认值。即如果我执行h=Hash.new{0}然后h["keythatdoesnotexist"],我返回0,而不是nil(如果没有{0},

  5. ruby - 字典 API 或库 - 2

    关闭。这个问题不符合StackOverflowguidelines.它目前不接受答案。我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。关闭4年前。Improvethisquestion有谁知道一个好的字典API或ruby​​库来查找单词的定义?我认为它应该像这样工作:我调用get_definition(word)它返回该词的定义(最好以某种方式轻松格式化显示的定义。谢谢

  6. javascript - 如何从 JSON 字典中按键检索随机 JSON 对象? - 2

    我有一个JSON对象,它由一长串其他JSON对象组成,这些对象具有一些共同的属性,例如:varmyData={"0291":{"Firstname":"Jeremy","Surname":"Dyson"},"0398":{"Firstnname":"Billy","Surname":"Bunter"},"6714":{"Firstnname":"Harry","Surname":"Peterson"},"9080":{"Firstnname":"Barry","secondname":"Joe","Surname":"Mainwaring"}......}我已经构建了一个html模板。

  7. javascript - Python 的字典 get 方法的 Javascript 等价物是什么 - 2

    Python的字典get方法允许我指定在键不存在时应返回的内容。对于我目前的情况,我想要返回一本字典。我如何在Javascript中执行此操作? 最佳答案 没有与python字典get方法等效的javascript。如果你自己写,作为一个函数,它看起来像这样:functionget(object,key,default_value){varresult=object[key];return(typeofresult!=="undefined")?result:default_value;}像这样使用它:varobj={"a":1};

  8. c# - JavaScriptSerializer.Deserialize() 到字典中 - 2

    我正在尝试解析OpenExchangeRatesJSON在Json中,我正在使用这种方法:HttpWebRequestwebRequest=GetWebRequest("http://openexchangerates.org/latest.json");HttpWebResponseresponse=(HttpWebResponse)webRequest.GetResponse();stringjsonResponse=string.Empty;using(StreamReadersr=newStreamReader(response.GetResponseStream())){js

  9. javascript - 将字符串转换为 javascript 字典 - 2

    我有一个这样的字符串,它是从数据库中检索到的。我需要将字符串转换为Javascript字典。"['content':{'type':'file','path':'callie/circle'},'video':{'videoId':'CvIr-2lMLsk','startSeconds':15,'endSeconds':30'}]".如何将上述字符串转换为Javascript字典?我应该先将字符串转换为json吗?当我尝试json.parse时,显示错误:UncaughtSyntaxError:Unexpectedtoken'atObject.parse(native)at:2:6at

  10. c# - 模型从 ASP.NET Web API 中的 URI 绑定(bind)到字典 - 2

    请引用MVC中的此链接:http://aspnetwebstack.codeplex.com/discussions/351011我在模型绑定(bind)方面遇到了问题。我从JavaScript向名为“/api/products”的API端点发出GETAjax请求,传入一些参数,包括分页和排序作为查询参数。这是完整的URI:http://localhost/api/products?page=1&count=10&filter[name]=Test1&filter[price]=10&sorting[name]=desc在服务器端,我有一个WebAPIController从URI接受这

随机推荐