python相同key合并value_Python字典及基本操作(超级详细)

本文介绍了Python字典的基本概念、操作及一些实用技巧。包括字典的定义、原理,增删改查的操作,如get方法、keys()、values()、items()的使用。此外,还讲解了如何合并字典(update方法和**操作符),以及列表内字典去重的解决方案,利用reduce函数实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

a213044f52b63d1d7027c94737f56c13.gif                           

    今天小张帮大家简单介绍下Python的一种数据结构: 字典,字典是 Python 提供的一种常用的数据结构,它用于存放具有映射关系的数据。

比如有份成绩表数据,语文:79,数学:80,英语:92,这组数据看上去像两个列表,但这两个列表的元素之间有一定的关联关系。如果单纯使用两个列表来保存这组数据,则无法记录两组数据之间的关联关系。
    为了保存具有映射关系的数据,Python 提供了字典,字典相当于保存了两组数据,其中一组数据是关键数据,被称为 key;另一组数据可通过 key 来访问,被称为 value。形象地看,字典中 key 和 value 的关联关系如图 1 所示:

259d19351c86fc1801072d51fdde8674.png

    由于字典中的 key 是非常关键的数据,而且程序需要通过 key 来访问 value,因此字典中的 key 不允许重复。

一.介绍

1.定义

dict(字典),以{}表示,每一项用逗号隔开, 内部元素用key:value的形式来保存数据,例如

{"jj":"林俊杰", "jay":"周杰伦"}

2.原理

  • 查询的效率非常高, 通过 key 来查找元素
  • 内部使用 key 来计算一个内存地址,采用 hash 算法,并且 key 必须是不可变的数据类型(即为可哈希的数据类型)
  • dict 保存的数据不是按照我们添加进去的顺序保存的. 是按照 hash 表的顺序保存的.而 hash 表不是连续的. 所以没有索引,不能进行切片工作. 它只能通过 key 来获取 dict 中的数据.
dic = {}  # 空字典dic['徐峥'] = "人在囧途" #直接用key往里面存数据即可print(dic["徐峥"]) # 最好别这么写,写成   print(dic.get("徐铮")),此时假入没有徐铮,程序也不会报错,会返回None

在这里顺便说下可哈希----可哈希就是不可变

  • 已知的可哈希(不可变)的数据类型: int, str, tuple, bool
  • 不可哈希(可变)的数据类型: list, dict, set 集合 此三类不能作为 key

二.字典的增、删、改、查

1. 字典的新增:

dic[新key] = "value"   # 如果k存在,会替换原来的valuedic.setdefault("key","value") # 如果key存在,跳过,不存在,则添加

2. 删除

1.pop(key)  #根据key删除    有返回值,可以写成value=dic.pop(key)print(value) # 打印删除的值,但是print(dic)  是整个键值对2.popitem() # 不写 key 随机删除,(2.x是随机的删除,3.x是删除最后一个字典)3.clear()  # 清空4.del dic[key]  # 按照key删除

3. 修改

dic[key] = 新值  # key 为原来的update()  dic1.update(dic2)  # 将字典2的内容放到1中,如果key1中存在,直接修改value,不存在的话附加到字典1 上

4. 查询

dic = {"徐锦江":"倩女幽魂","苏有朋":"倚天屠龙记"}1. 用key直接查询 print(dic["徐锦江"])   #注意,key不存在会报错,此时可以用get,get有返回值2. dic.get(key)  #没有key返回Noneprint(dic.get("苏有朋"))   # 倚天屠龙记3. setdefault()  print(dic.setdefault("徐锦江"))    #倩女幽魂

5. 其他操作

5.1 get 常用方法
dic={}print(dic.get("name"))    #Noneprint(dic.get("name","张三"))   #张三(如果获取为None时,可以自定义默认值)print(dic)   #{}dic2={"name":"李四"}print(dic2.get("name","张三"))   #李四(获取非None时,自定义值不起作用)
5.2 keys()、 values()、 items()的用法

例子:

dic = {"汪峰": "大陆音乐半壁江山", "周杰伦": "亚洲音乐天王", "罗志祥": "亚洲舞王"}print( dic.keys())print(dic.values())print(dic.items())结果如下:dict_keys(['汪峰', '周杰伦', '罗志祥'])dict_values(['大陆音乐半壁江山', '亚洲音乐天王', '亚洲舞王'])dict_items([('汪峰', '大陆音乐半壁江山'), ('周杰伦', '亚洲音乐天王'), ('罗志祥', '亚洲舞王')])

可执行 这个返回的不是列表, 很像列表,一般不这么用,而是如下操作

  • keys() 获取所有键

for el in dic:    print(el)   #   直接拿到key value需要字典查一下    print(dic[el])  #两者用法一样for key in dic.keys():  print(key)   #   取出key  print(dic[key])  #  取出 value
  • values()获取所有的值

for value in dic.values():     print(value)      #取出value
  • items() 获取所有的键值对. 返回的是元组

for item in dic.items():    print(item)#结果('汪峰', '大陆音乐半壁江山')('周杰伦', '亚洲音乐天王')('罗志祥', '亚洲舞王')#如果都想拿到 根据解构的思路可以改写成for k,v in dic.items():    print(k)    # 取出key       汪峰    print(v)     # 取出values    大陆音乐半壁江山    print(k,v)    #      在一排显示 汪峰 大陆音乐半壁江山
5.3 fromkeys 是一个类方法.作用是创建新字典

fromkeys 是一个类方法.作用是创建新字典例

例子1:d = {}dd = d.fromkeys(["胡辣汤","are you 确定?"], "周芷若")print(d) # 原字典没有改变   {}print(dd) # 新的字典是通过第一个参数的迭代. 和第二个参数组合成key:value创建新字典   {'胡辣汤': '周芷若', 'are you 确定?': '周芷若'}例子2:d = dict.fromkeys(["哇哈哈", "爽歪歪"], []) # 所有的key用的都是同一个列表,改变其中一个。另一个也跟着改变d["哇哈哈"].append("张无忌")print(d) # {'哇哈哈': ['张无忌'], '爽歪歪': ['张无忌']}

三 小技巧,骚操作

1.合并字典。

  • 方法 1 : 使用 update() 方法,第二个参数合并第一个参数
def Merge(dict1, dict2):    return(dict2.update(dict1))# 两个字典dict1 = {'a': 10, 'b': 8}dict2 = {'d': 6, 'c': 4}# 返回  Noneprint(Merge(dict1, dict2))# dict2 合并了 dict1print(dict2)执行以上代码输出结果为:None{'d': 6, 'c': 4, 'a': 10, 'b': 8}
  • 方法 2 : 使用 **,函数将参数以字典的形式导入
def Merge(dict1, dict2):    res = {**dict1, **dict2}    return res# 两个字典dict1 = {'a': 10, 'b': 8}dict2 = {'d': 6, 'c': 4}dict3 = Merge(dict1, dict2)print(dict3)执行以上代码输出结果为:{'a': 10, 'b': 8, 'd': 6, 'c': 4}

2.列表内字典去重

    列表的内的元素类型为字符串或这 int 类型的,借助集合 set,会很方便的去重,但是如果元素 dict,此时利用 set 去重将会报错TypeError: unhashable type: 'dict',以下介绍一个简单的方法,利用 reduce 简单说下 reduce reduce() 函数会对参数序列中元素进行累积。函数将一个数据集合(链表,元组等)中的所有数据进行下列操作:用传给 reduce 中的函数 function(有两个参数)先对集合中的第 1、2 个元素进行操作,得到的结果再与第三个数据用 function 函数运算,最后得到一个结果。

  • 语法: reduce(function, iterable[, initializer])
  • 参数 function -- 函数,有两个参数 iterable -- 可迭代对象 initializer -- 可选,初始参数
  • 返回值 返回函数计算结果 具体代码如下:
from functools import reducedef list_dict_duplicate_removal():    data_list = [{"a": "123", "b": "321"}, {"a": "123", "b": "321"}, {"b": "321", "a": "123"},{"d":12,"sdf":2312}]    run_function = lambda x, y: x if y in x else x + [y]    return reduce(run_function, [[], ] + data_list)if __name__ == '__main__':    print (list_dict_duplicate_removal())#结果如下[{'a': '123', 'b': '321'}, {'d': 12, 'sdf': 2312}]

e67e4bf85356ed686089132f983528e7.gif

7a8df2273f430983b92f414db8739384.png

53749beb100879634414d35209ed7f7d.png             556eb841c6493236550c2b5aff77cf2f.gif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值