数据类型-字典

字典也是python最常用的数据类型之一,不同与list或者str,字典的定义是以键值对,键和值之间用:分隔,多个键值对用 , 分隔,通常是由不可变类型,列表不可以作为键,创建的方式是以一对{}

1. 特点

  • 字典中的键是唯一的: 如果由重复,后面的键会覆盖之前的
  • python3.6以前字段是无序的,3.6之后是有序的
  • 字典不支持索引切片
  • 字典为可变类型

示例

# 创建有值的字典
dict1 = {'name': 'Tom', 'age': 20, 'gender': 'male'}
dict2 = dict(name='tome',age=20, gender='male')

# 空字典
dict3 = {}
dict4 = dict()
一般称冒号前面的为键(key),简称 k冒号后面的为值(value),简称 v

2. 字典的常见操作

2.1 增

字典中的就是为字典添加键值对,
语法

  • 字典序列[key] = 值
如果 key存在修改这个key对应的值;如果 key不存在 新增此键值对

示例

dict1 = {'name': 'Tom', 'age': 20, 'gender': '男'}

dict1['name'] = 'Rose'
print(dict1)
# 结果:{'name': 'Rose', 'age': 20, 'gender': '男'}

dict1['id'] = 110
print(dict1)
# {'name': 'Rose', 'age': 20, 'gender': '男', 'id': 110}

3.2 删

  • del:删除字典或删除字典中指定键值对

示例

dict1 = {'name': 'Tom', 'age': 20, 'gender': '男'}

del dict1['gender']

print(dict1)
# 结果:{'name': 'Tom', 'age': 20}
  • clear():清空字典
dict1 = {'name': 'Tom', 'age': 20, 'gender': '男'}

dict1.clear()
print(dict1) 
# 结果: {}

3.3 改

语法

  • 字典序列[key] = 值
如果 key存在修改这个key对应的值;如果 key不存在 新增此键值对

3.4 查

3.4.1 按 key 查找
dict1 = {'name': 'Tom', 'age': 20, 'gender': '男'}

print(dict1['name']) 
# 结果: Tom

print(dict1['id'])
# 结果: 报错
如果key不存在字典中,程序抛出异常 KeyError: key
3.4.2 get()

语法

  • 字典序列.get(key, 默认值)
如果当前查找的 key不存在返回第二个参数(默认值),如果省略第二个参数,则返回 None,这样的好处是 程序不会抛异常
dict1 = {'name': 'Tom', 'age': 20, 'gender': '男'}

print(dict1.get('name')) 
# 结果: Tom

print(dict1.get('id', 110))
# 结果: 110

print(dict1.get('id')) 
# 结构: None
3.4.3 keys()

语法

  • 字典序列.keys()

示例

dict1 = {'name': 'Tom', 'age': 20, 'gender': '男'}

print(dict1.keys()) 
# 结果: dict_keys(['name', 'age', 'gender'])
多搭配循环使用, 返回一个list, 里面存放的是当前dict的所有kkey
3.4.4 values()

语法

  • 字典序列.values()

示例

dict1 = {'name': 'Tom', 'age': 20, 'gender': '男'}

print(dict1.values())
# 结果: dict_values(['Tom', 20, '男'])
多搭配循环使用, 也是返回一个list, 里面存放的是当前dict的所有 value
3.4.5 items()

语法

  • 字典序列.items()

示例

dict1 = {'name': 'Tom', 'age': 20, 'gender': '男'}

print(dict1.items()) 
# 结果: dict_items([('name', 'Tom'), ('age', 20), ('gender', '男')])
多搭配循环使用,返回也是一个list, 里面是以 元祖 的形式存放dictkeyvalue

4.常见的集中字典循环遍历

4.1 遍历字典中的 key

dict1 = {'name': 'Tom', 'age': 20, 'gender': '男'}

for key in dict1.keys():
    print(key)

4.2 遍历字典的value


dict1 = {'name': 'Tom', 'age': 20, 'gender': '男'}

for value in dict1.values():
    print(value)

4.3 遍历字典的元素

dict1 = {'name': 'Tom', 'age': 20, 'gender': '男'}

for key, value in dict1.items():
    print(f'{key} = {value}')

5. defaultdict

defaultdictcollections 模块对字典类型的补充,它可以给字典的值设置一个类型,在使用原生字典dict时, d[key]获取value的时候,如果key 不存在,程序抛出异常,KeyError异常

使用 defaultdict,只要你传入一个默认的工厂方法,当获取不存在的key时, 便会调用这个工厂方法使用其结果来作为这个key的默认值
示例

from collections import defaultdict

d = {}
# print(d['a'])
# 结果:KeyError: 'a'

dd = defaultdict(lambda: 'aaa')
print(dd['key'])
# 结果:aaa


s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)]

d = defaultdict(list)
for k, v in s:
    d[k].append(v)
    
print(d)
# 结果:defaultdict(<class 'list'>, {'yellow': [1, 3], 'blue': [2, 4], 'red': [1]})

6. OrderedDict

python3.6以前字典是无序的,collection模块中OrderedDict是针对这一问题的补充,它可以为我们创建有序字典
示例

from collections import OrderedDict

d = {'a': 3, 'b': 2, 'c': 1}
dd = OrderedDict(a=1, b=2, c=3)

for k,  v in d.items():
    print(k,  v)
    
"""
    a 3
     c 1
    b 2
"""

for k,  v in dd.items():
    print(k, v)
    
"""
    a 1
    b 2
    c 3
"""
from collections import OrderedDict

items = (
    ('a', 3),
    ('b', 2),
    ('c', 1)
)


regular_dict = dict(items)
ordered_dict = OrderedDict(items)

for k, v in regular_dict.items():
    print(k, v)
    
""" 
     c 1
     a 3
     b 2
"""

for k, v in ordered_dict.items():
    print(k, v)
    
"""
    b 2
    c 3
    a 1
"""
如果原生的字典也是有序的,请注意当前python版本

6.1 其他方法

  • move_to_end(key, last=True):
将现有key移动到有序字典的任一端。 如果 lastTrue 值(默认)则将元素移至末尾;如果 lastFalse值则将元素移至开头。如果key不存在则会触发 KeyError
示例
d = OrderedDict.fromkeys('abcde')

d.move_to_end('b')

print(' '.join(d.keys()))
# 结果: acdeb

d.move_to_end('b', last=False)

print(' '.join(d.keys()))
#结果: bacde
  • popitem(last=True):
有序字典的 popitem() 方法移除并返回一个 (key, value) 键值对。 如果last值为Tru,则按后进先出的顺序返回键值对,否则就按先进先出的顺序返回键值对。
示例
dd = OrderedDict(a=1, b=2, c=3)

data = dd.popitem()

print(data)
# 结果:('c', 3)

data = dd.popitem(last=False)

print(data)
# 结果: ('a', 1)

无常
21 声望0 粉丝