【python】字典操作,1个键对应多个值

本文介绍了如何使用Python的collections模块中的defaultdict来高效地处理和组织数据,通过两个实例展示了如何利用list和set作为默认工厂函数,分别创建键对应的值为列表和集合的数据结构。
from collections import defaultdict

s = [('class',1),('rose', 2), ('bob', 3), ('bob', 4), ('rose', 1)]
d = defaultdict(list)
for k,v in s:
    d[k].append(v)
print(d)

dic = defaultdict(set)
for k, v in s:
    dic[k].add(v)
print(dic)

# 输出结果
defaultdict(<class 'list'>, {'class': [1], 'rose': [2, 1], 'bob': [3, 4]})
defaultdict(<class 'set'>, {'class': {1}, 'rose': {1, 2}, 'bob': {3, 4}})

Python 中,字典的“一个对应多个”可以通过以下几种方式实现。因为标准的字典(`dict`)中每个只能对应一个,但我们可以通过让这个“”本身是一个**容器**(如列表、元组或集合)来存储多个数据。 --- ### ✅ 方法一:使用列表作为(推荐,可追加) ```python # 创建一个字典一个对应多个(使用列表) d = {} # 添加对应多个 key = 'fruits' value = 'apple' if key not in d: d[key] = [] # 初始化为空列表 d[key].append(value) d[key].append('banana') d[key].append('cherry') print(d) # 输出: {'fruits': ['apple', 'banana', 'cherry']} ``` 更简洁的方式是使用 `defaultdict`: ```python from collections import defaultdict # 使用 defaultdict(list),自动初始化列表 d = defaultdict(list) d['fruits'].append('apple') d['fruits'].append('banana') d['vegetables'].append('carrot') d['fruits'].append('cherry') print(dict(d)) # 输出: {'fruits': ['apple', 'banana', 'cherry'], 'vegetables': ['carrot']} ``` --- ### ✅ 方法二:使用集合(set)避免重复 如果你不希望有重复,并且不在乎顺序: ```python from collections import defaultdict d = defaultdict(set) d['fruits'].add('apple') d['fruits'].add('banana') d['fruits'].add('apple') # 重复,不会添加 print(dict(d)) # 输出: {'fruits': {'apple', 'banana'}} ``` --- ### ✅ 方法三:使用元组(不可变,适合固定多个) ```python d = {} d['coordinates'] = (10, 20) d['colors'] = ('red', 'green', 'blue') print(d['colors']) # 输出: ('red', 'green', 'blue') ``` 注意:元组一旦创建就不能修改,要更新需要重新赋。 --- ### ✅ 方法四:手动管理列表(不用 defaultdict) ```python d = {} def add_value(d, key, value): if key in d: d[key].append(value) else: d[key] = [value] add_value(d, 'subjects', 'math') add_value(d, 'subjects', 'science') add_value(d, 'subjects', 'english') print(d) # 输出: {'subjects': ['math', 'science', 'english']} ``` 等价于使用 `setdefault`: ```python d = {} d.setdefault('subjects', []).append('math') d.setdefault('subjects', []).append('science') d.setdefault('subjects', []).append('english') print(d) # 输出: {'subjects': ['math', 'science', 'english']} ``` --- ### 总结对比: | 方法 | 是否可重复 | 是否可变 | 是否自动初始化 | 适用场景 | |------|------------|----------|----------------|----------| | 列表 `list` | 是 | 是 | 否(可用 `defaultdict`) | 一般多存储 | | 集合 `set` | 否 | 是 | 否(可用 `defaultdict(set)`) | 去重 | | 元组 `tuple` | 是 | 否 | 手动 | 固定 | | `setdefault()` | 是 | 是 | 是(一行内) | 简单场景 | --- ### 推荐做法: 对于大多数情况,推荐使用 `defaultdict(list)` 或 `setdefault` 来实现一。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值