Python-字典【Dict】

1、简介

Dict即Dictionary,也称为mapping。
Python中,字典由任意个元素构成的集合,每一个元素称为Item,也称为Entry。这个Item是由(key, value)组成的二元组。
字典是可变的、无序的、key不重复的key-value键值对集合。

2、初始化

2.1、语法

dict(**kwargs) 使用name=value对初始化一个字典
dict(iterable, **kwarg) 使用可迭代对象和name=value对构造字典,不过可迭代对象的元素,必须是一个二元结构**
dict(mapping, **kwarg) 使用一个字典构建另一个字典

2.2.、示例

d1 = {}
d2 = dict()
d3 = dict(a=100, b=200)
d4 = dict(d3) # 构造另外一个字典
d5 = dict(d4, a=300, c=400)
d6 = dict([('a', 100), ['b', 200], (1, 'abc')], b=300, c=400)

# 类方法dict.fromkeys(iterable, value)
d = dict.fromkeys(range(5))
d = dict.fromkeys(range(5), 0)

3、元素访问

d[key]
返回key对应的值value
key不存在抛出KeyError异常
get(key[, default]) 返回key对应的值value key不存在返回缺省值,如果没有设置缺省值就返回None
setdefault(key[, default]) 返回key对应的值value key不存在,添加kv对,value设置为default,并返回default,如果default没有设置,缺省为None

4、新增和修改

4.1、语法

d[key] = value
将key对应的值修改为value
key不存在添加新的kv对
update([other])
-> None 使用另一个字典的kv对更新本字典 key不存在,就添加 key存在,覆盖已经存在的key对应的值就地修改

4.2、示例

d = {}
d['a'] = 1
d.update(red=1)
# d.update(['red', 2]) 报错
d.update({'red':3})
print(d)

5、删除

pop(key[, default]) 
key存在,移除它,并返回它的value
key不存在,返回给定的default
default未设置,key不存在则抛出KeyError异常

popitem()
移除并返回一个任意的键值对
字典为empty,抛出KeyError异常

clear()
清空字典

6、遍历

6.1、遍历Key

for k in d:
    print(k)
for k in d.keys():
    print(k)

6.2、遍历Value

for v in d.values():
    print(v)

for k in d.keys():
    print(d[k])
    print(d.get(k))

6.3、遍历Item

for item in d.items():
    print(item)
    print(item[0], item[1])

for k,v in d.items():
    print(k, v)

for k,_ in d.items():
    print(k)

for _,v in d.items():
    print(v)

6.4、遍历与删除

d = dict(a=1, b=2, c=3)
keys = []
for k,v in d.items():
    keys.append(k)

for k in keys:
    d.pop(k)

# 在使用keys、values、items方法遍历的时候,不可以改变字典的size

6.5、小结

Python3中,keys、values、items方法返回一个类似一个生成器的可迭代对象Dictionary view对象,可以使用len()、iter()、in操作字典的entry的动态的视图,字典变化,视图将反映出这些变化
keys返回一个类set对象,也就是可以看做一个set集合。如果values都可以hash,那么items也可以看做是类set对象

Python2中,上面的方法会返回一个新的列表,立即占据新的内存空间。所以Python2建议使用iterkeys、itervalues、iteritems版本,返回一个迭代器,而不是返回一个copy

7、key

字典的key和set的元素要求一致
set的元素可以就是看做key,set可以看做dict的简化版
hashable 可哈希才可以作为key,可以使用hash()测试
使用key访问,就如同列表使用index访问一样,时间复杂度都是O(1),这也是最好的访问元素的方式

d = {
    1 : 0, 
    2.0 : 3, 
    "abc" : None,  
   ('hello', 'world', 'python') : "string", 
    b'abc' : '135'
}

8、有序性

8.1、简介

字典元素是按照key的hash值无序存储的。
但是,有时候我们却需要一个有序的元素顺序,Python 3.6之前,使用OrderedDict类可以做到,3.6开始dict自身支持。到底Python对一个无序数据结构记录了什么顺序?

8.2、python3.5示例

# 3.5如下
C:\Python\Python353>python
Type "help", "copyright", "credits" or "license" for more information.
>>> d = {'a':300, 'b':200, 'c':100, 'd':50}
>>> d
{'c': 100, 'a': 300, 'b': 200, 'd': 50}
>>> d
{'c': 100, 'a': 300, 'b': 200, 'd': 50}
>>> list(d.keys())
['c', 'a', 'b', 'd']
>>> exit()

C:\Python\Python353>python
>>> d = {'a':300, 'b':200, 'c':100, 'd':50}
>>> d
{'b': 200, 'c': 100, 'd': 50, 'a': 300}

8.3、python3.6示例

# 3.6+表现如下
C:\Python\python366>python
>>> d = {'c': 100, 'a': 300, 'b': 200, 'd': 50}
>>> d
{'c': 100, 'a': 300, 'b': 200, 'd': 50}
>>> exit()

C:\Python\python366>python
>>> d = {'c': 100, 'a': 300, 'b': 200, 'd': 50}
>>> d
{'c': 100, 'a': 300, 'b': 200, 'd': 50}
>>> d.keys()
dict_keys(['c', 'a', 'b', 'd'])

8.4、小结

目前,建议不要3.6提供的这种字典特性,还是以为字典返回的是无序的,可以在Python不同版本中考虑使用OrderedDict类来保证这种录入序。

 

posted @ 2023-06-27 15:10  小粉优化大师  阅读(50)  评论(0)    收藏  举报