python基础之字典

字典简介

  • python 字典以key value键值对形式的元素的集合。
  • 可以多层嵌套。
  • 任何可哈希的值都可以作为字典的键。
  • 字典的key不可重复,如果重复添加相同的key后添加的会覆盖先添加key对应的value。
  • 在 Python3.7 + 以后,字典记住了插入的顺序。

字典的声明

方式一 {}

使用一对中括号 {},键值对中间用冒号,每项间使用逗号分割。
字典的value类型可以不相同,可以为字符串,数值,集合。

d1 = {"user_name": "Maple", "age": 18, "爱好": ["跑步", "编程"], "info": {"籍贯": "中国", "性别": "男"}}

方式二 列表推导方式

d2 = {k: v for k, v in [("user_name", "Maple"), ("age", 18), ("爱好", ["跑步", "编程"]), ("info", {"籍贯": "中国", "性别": "男"})]}

#根据value进行过滤
d3 = {
       "id": 1,
       "key": "key",
       "name": "maple",
       "desc": "列表推导式",
       "None": None,
       "False": False,
       "True": True,
       "zero": 0,
       "empty": "",
     }
 d3 = {k: v for k, v in d3.items() if v is not None}
 #根据key进行过滤
 d4 = {k: v for k, v in d3.items() if k in ["name", "desc"]}
 d5 = {k: f"key_{k}" for k in range(100)}

方式三 通过键值对创建

d6 = dict(user_name="Maple", age=18)

方式四 通过元组列表创建

d7 = dict([("user_name", "Maple"), ("age", 18), ("爱好", ["跑步", "编程"]), ("info", {"籍贯": "中国", "性别": "男"})])

方式五 使用 fromkeys 创建字典

可以给很多个 key 赋予相同的 value
 d8 = dict.fromkeys(["key1", "key2", "key3"], "12345")
 print(d8)# {'key1': '12345', 'key2': '12345', 'key3': '12345'}

方式六 默认字典 defaultdict

(此处转载自:https://my.oschina.net/u/4589216/blog/4408954 如有侵权联系删除)
默认字典为字典的每一个 key 都设置了默认值的字典。通过 collections 模块中的defaultdict 类实现。

defaultdict 是内置 dict 类的子类。大部分功能和 dict 相同,有一点高级的是使用 defaultdict 声明字典时,可以传入一个 default_factory 属性,这个属性用来给字典中所有的 key 生成默认值。

比如,生成一个所有字典值默认为列表 [] 的字典:

from collections import defaultdict
list_dict = defaultdict(list)  # default_factory 这里就是list,list的默认值是[], 所以字典list_dict所有的key默认值都是[]
print(list_dict['a'])  # 具有默认值的字典,没有key时会输出default_factory的默认值[]
origin_dict = dict()
print(origin_dict['a'])  # 普通字典,没有key时会报KeyError

使用 list 作为 default_factory,很轻松地将(键 - 值对组成的)列表转换为(键 - 列表组成的)字典,遇到相同的键,则可以将多个值组成列表

from collections import defaultdict
list_dict = defaultdict(list)  # default_factory 这里就是list,用来给所有的key设置默认值[]
s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)]
for k, v in s:
    list_dict[k].append(v)
print(list_dict)
print(list_dict.items())

首先,通过 defaultdict (int),声明一个字典,所有的 key 默认值 []。当代码第一次遇见一个键时,因为它还没有在字典里面,执行 list_dict [k] 时自动创建该 k 并默认值是空列表 [],接着通过 append(v) 操作添加值 v 到列表中。如果代码再次遇到同一个键时,通过 append 添加另一个值到列表 list_dict [k] 中。这个方法比它的等价方法 dict.setdefault() 要快速和简单:

s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)]
d = {}
for k, v in s:
    d.setdefault(k, []).append(v)
print(d)

使用 int 作为 default_factory,可以用来统计。比如统计字符串中每一个字母出现的次数。

s = 'mississippi'
int_dict = defaultdict(int)  # default_factory 这里就是int,用来给所有的key设置默认值0
for k in s:
    int_dict[k] += 1
print(int_dict.items())

首先,通过 defaultdict (int),声明一个字典,所有的 key 默认值 0。for 循环中,当代码第一次遇到一个 key 时,因为它还没有在字典里,因此执行 int_dict [k] 时自动创建该 k,并且调用 defaultdict 的 default_factory int (),将值设置成 0,接着通过 += 计数加 1。如果代码再次遇到相同的 key 时,就在 key 已有值的基础上加 1。这个题目这也可以用原始方法:

d = {}
for k in s:
    if k not in d:
        d[k] = 0
    d[k] += 1
print(d)

使用 str 作为 default_factory,可以用来对字典的值进行字符串操作,比如拼接。看下面这个例子:
已知 a = [‘a,1’, ‘b,3,22’, ‘c,3,4’, ‘f,5’,] 和 b = [‘a,2’, ‘b,4’, ‘w,12’, ‘d,2’, ‘c,123’] 两个列表,需要将两个列表中有相同字母的字符串合并,合并后的结果:c = [‘a,1,2’, ‘b,3,22,4’, ‘c,3,4,123’, ‘f,5’, ‘w,12’, ‘d,2’]。

str_dict = defaultdict(list)
[str_dict[k.split(",")[0]].append(k[2:]) for k in a + b]
print(str_dict)
ls = [f"{k}," + ','.join(set(v)) for k, v in str_dict.items()]
print(ls)

方式七 有序字典 OrderedDict

有顺序的字典,相对于普通字典多了move_to_end方法
move_to_end方法:
将一个存在的key移动到字典的最后(last is true 默认)或者开头(last is false)。如果key不存在将会报错。

from collections import OrderedDict
order_dict = OrderedDict()
order_dict.update({"key1": "value1", "key2": "value2", "key3": "value3", "key4": "value4"})
order_dict.move_to_end("key1")
print(order_dict.keys())
#odict_keys(['key2', 'key3', 'key4', 'key1'])
print(order_dict.values())
#odict_values(['value2', 'value3', 'value4', 'value1'])
print(order_dict.items())
#odict_items([('key2', 'value2'), ('key3', 'value3'), ('key4', 'value4'), ('key1', 'value1')])

字典的操作

  1. 访问值
d1 = {'name': 'jason', 'age': 20, 'gender': 'male', 'score': {'Engilish': 90, 'Math': 99}}
print(d1['name'])
print(d1.get('age'))
print(d1.get('birthday', 2000))  # 对于没有的key,则返回默认值,如果没有指定默认值则返回None
for key, value in d1.items():
    print(key, value)
  1. 设置和修改值
d1 = {'name': 'jason', 'age': 20, 'gender': 'male', 'score': {'Engilish': 90, 'Math': 99}}
print(d1.setdefault('address','Beijing'))# 键不存在于字典中,将会添加键并将值设为默认值Beijing
print(d1.setdefault('age',10)) # 如果key在字典中存在,则返回其值,20
d1['class']=1 # class在字典中不存在,则增加class这个key
d1['age'] = 30  # age在字典中存在,则修改其值
print(d1)
  1. 删除 key
d1 = {'name': 'jason', 'age': 20, 'gender': 'male', 'score': {'Engilish': 90, 'Math': 99}}
print(d1.pop('name'))  # 返回并删除指定的key
print(d1.popitem())  # 返回并删除字典中的最后一对键和值。
  1. 判断 key 是否存在
d1 = {'name': 'jason', 'age': 20, 'gender': 'male', 'score': {'Engilish': 90, 'Math': 99}}
print('jason' in d1)  # False
print('Engilish' in d1)  # False
print('Engilish' in d1.get("score"))  # True
print('address' not in d1)  # True
  1. 排序
score = {'Engilish': 90, 'Math': 59, 'Chinese': 30}
d_sorted_by_key = dict(sorted(score.items(), key=lambda x: x[0]))
print(d_sorted_by_key)  # {'Chinese': 30, 'Engilish': 90, 'Math': 59}
d_sorted_by_value = dict(sorted(score.items(), key=lambda x: x[1]))
print(d_sorted_by_value)  # {'Chinese': 30, 'Math': 59, 'Engilish': 90}
  1. 合并两个字典

将一个字典的素有键值对,插入到另外一个字典:

score = {'Engilish': 90, 'Math': 59, 'Chinese': 30}
student = {'name': 'jason', 'age': 20, 'gender': 'male'}
merged_dict = dict(student, **score)  #方法①
print(merged_dict)
student.update(score)  # 方法②
print(student)
  1. key value转换
# 如果id为id_map中的key就替换为对应的value否则还是原值
id = "n"
id_map = {'1': '2', '3': '6', '4': '7', '5': '9'}
id = app_id_map.get(id,id)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值