Python字典Dict详解:创建、操作与高效查找方法
[id_90072197]

与 list 相比,在 list 中查找元素的方式是,当 list 越大时,查找就会越慢。然而,dict 的实现方式是,依据 key 值计算出 value 的存放位置,接着再去获取该存放位置的值。并且一个 key 只能对应一个 value 值,这样就提高了查找的速度。
一、创建字典 1、直接创建
使用 dict 进行创建时,所提供的参数必须成对出现。若不提供任何参数,创建出的是一个空字典。比如可以通过 dict(([1,'x'],[2,'y'])) 或者 dict(zip((1,2),('x','y'))) 来创建字典。
3、fromkeys(key,value)创建
(1)关于 for 循环,它用于遍历字典的 key,举例来说:
for key in dict_name:
print(dict_name[key])
# 根据字典键key进行排序输出
在 sorted(dict_name) 中遍历 key 。 # 这里是 sorted(),并非 sort() 。
print(dict_name[key])
通过 in 关键字来判断某键值 key 是否存在,然后返回 True 或者 False。例如:
'pi' in d
False
get()函数能够获取字典中特定 key 的 value 值。若该 key 不存在,就会返回默认值。并且还可以自行设定默认返回值,像 get('pi',0)这种情况,当字典中存在 key 为 pi 时,就会返回 0。
使用 get 方法获取键为 'xiong' 的值,也可以直接通过索引方式 d['xiong'] 来获取
90
获取键为'pi'的值,如果不存在该键,则返回 0,若存在则返回其原值。
0
当 dict 中存在 list 类型时,能够将 list 当作一个 item 来看待,并且可以对其进行 list 相关的操作。例如:
inventory = {
'gold' : 500,
“pouch”包含“flint”、“twine”和“gemstone”。
'backpack' 包含的物品有:'xylophone'、'dagger'、'bedroll'、'bread loaf'
}
# 新添加一个key-value
inventory 中包含“burlap bag”,其里面有“apple”“small ruby”“three-toed sloth”。
“黄金”在库存中的数量增加了 50 。
对 inventory 中的['backpack']进行排序。
从 inventory['backpack']中移除 'dagger' 。
pop() 这个操作可以删除字典中的键值对,既可以指定要删除的键,也可以使用默认的键进行删除。
d 中包含键 'xiong' 及其对应的值 90,包含键 'li' 及其对应的值 95,还包含键 'ping' 及其对应的值 100。
>>> d.pop('xiong')
90
>>> d
该内容中包含一个字典,字典的键为'li',值为 95,键为'ping',值为 100。
删除 dict 中的元素,其语法形式为 del dict_name[key_name]
>>> del d['ping']
>>> d
{'li': 95}
clear()会清空字典中的所有元素,此时字典依然存在,只是变成了一个空字典。
# 语法形式
>>> dict_name.clear()
统计一个 dict 的长度,也就是统计有多少个键值对,其使用形式为 len(dict_name)。dict 有三个方法,分别是 keys()、values()、items()。keys()、values()、items()这三个方法的返回值类型不再是列表,而是视图对象(view objects)。其中:keys()能够返回 dict_keys 对象,通过该对象可以查看字典的所有 key,其使用方法为 dict_name.keys()。values()能够返回 dict_keys 对象,借助该对象可以查看字典的 value,其使用方法为 dict_name.values()。items()这个函数的作用是返回 dict_items 对象,通过它可以查看字典中所有的(key, value)二元组,也就是 dict.items()。例如:
d_1 包含 1 对应 'x',2 对应 'y',3 对应 'z'
>>> d_1.keys()
dict_keys([1, 2, 3])
>>>
>>> d_1.values()
这个 dict_values 包含了 'x'、'y' 和 'z' 这几个元素。它是一个特定的数据结构,其中存储了这些字符串值。这些值可以通过索引或迭代等方式进行访问和操作。
>>>
>>> d_1.items()
有一些键值对,其中一个键为 1 对应的值是 'x',一个键为 2 对应的值是 'y',一个键为 3 对应的值是 'z'
>>>
查看 d_1 的 keys 的类型,查看 d_1 的 values 的类型,查看 d_1 的 items 的类型
(, , )
视图对象能够动态地查看字典的内容。每当字典发生变化时,视图会自动进行更改。
(10)copy():字典拷贝
现在有一个 dict1,我们要创建一个与之相同的 dict2,能够通过赋值操作“=”来创建一个内容相同的 dict2。然而,对 dict2 的值进行修改会导致 dict1 的值发生改变。
字典 dict1 中,“up”被替换为“down”,“right”被替换为“left”,“true”被替换为“false”。
>>> dict2 = dict1
dict2 的“up”被赋值为“change”,对赋值而来的 dict2 的修改会同时修改 dict1(源)。
>>> dict1
将“up”改为“change”,将“right”改为“left”,将“true”改为“false”。
为什么会这样呢?请看下图,通过赋值操作“=”创建出的新字典变量,它们所指向的 id 是相同的。因此,当对新变量的内容引用进行修改时,源所指向的 id 内容也随之发生了改变。
若要修改新创建的变量却不影响源变量,便可使用 copy()。比如,以下 copy 的值不会对 dict1 的值进行修改。
>>> dict1 = {'up':'down','right':'left','true':'false'}
字典 copy 是对 dict1 进行的拷贝操作。字典 copy 等于 dict1 的拷贝。字典 copy 是由 dict1 拷贝而来的。
将“up”赋值为“change2”。
对拷贝的 copy 字典进行修改,源字典不会被修改。
{'up': 'change', 'right': 'left', 'true': 'false'}
总结:
而list相反:
所以,dict 是一种通过牺牲空间来获取时间的方式。dict 能够应用于许多需要高速查找的场合,在 Python 代码里几乎随处可见。正确地使用 dict 极为重要,需要牢记的首要一点是 dict 的 key 必须是不可变的对象。
三、注意陷阱
有些 Python 里,dict 不一定会按照键 - 值的添加顺序去保存元素的顺序。
要保证字典的顺序性,就可以运用 Python 标准库中的 collections 模块的 OrderDict 来创建有序字典。
使用方式:
有一个类叫做 OrderDict,它来自于 collections 模块。
OrderDict().keys()
在复制和遍历字典的过程中,最坏情况的复杂度是 O(n),这里的 n 指的是字典曾经达到的最大元素数目,并非当前字典的大小。因此,在这种情况下遍历这个字典可能会花费相当长的时间。如果需要频繁地遍历这个字典,最好的办法是创建一个新的字典对象,而不是在旧的字典中对元素进行操作,比如删除元素。
持续更新ing...