对于字典的一些排序,运算等操作

字典中的键映射多个值:
一个字典就是一个键对应一个值,如果想要一个键对应多个值,可以考虑将多个值放到一个容器里(列表,集合),这是常规的方法,也可以用简便的方法,就是collections模块中的defaultdict来构造这样的字典

>>> from collections import defaultdict
>>> d = defaultdict(list)
>>> d['c'] = 4
>>> d['a'] = [1,2,3]
>>> d['b'] = [3,5,9,7]
>>> d
defaultdict(<class 'list'>, {'a': [1, 2, 3], 'b': [3, 5, 9, 7], 'c': 4})

可以看到我们直接可以给字典的键赋值一个list,自然,如果将上面defaultdict后面括号里的list换成set的话,后面可以给字典的键赋值一个集合,defaultions还可以自动初始化每一个key刚开始对应的值(在字典中加入一个新键,可以自动给它赋值为none,这样就不会在赋值时因为字典中没有这个键而报错,也省去了给字典初始化这一步)

>>> b = {}
>>> b['a'] = 1
>>> b
{'a': 1}
>>> b['a'].append(3)
Traceback (most recent call last):
  File "<pyshell#57>", line 1, in <module>
    b['a'].append(3)
AttributeError: 'int' object has no attribute 'append'
>>> d['a'].append(3)
>>> d
defaultdict(<class 'list'>, {'a': [1, 2, 3, 3], 'b': [3, 5, 9, 7], 'c': 4})
>>> d['b'].extend([12,4])
>>> d
defaultdict(<class 'list'>, {'a': [1, 2, 3, 3], 'b': [3, 5, 9, 7, 12, 4], 'c': 4})

字典中的值是一个列表,它支持关于列表的基本操作,是我们用起来更加简单
控制元素顺序
基本的字典是没有顺序的,我们有时候想在迭代或序列化这个字典的时候能够控制元素的顺序,可以使用collections模块里面的OrderedDict类,它可以保证元素被插入字典是的顺序:

>>> from collections import OrderedDict
>>> d = OrderedDict()
>>> d['a'] = 1
>>> d['c'] = 2
>>> d['e'] = 3
>>> d['d'] = 4
>>> d
OrderedDict([('a', 1), ('c', 2), ('e', 3), ('d', 4)])
>>> for key in d:
	print(key,d[key])
	
a 1
c 2
e 3
d 4

OrderedDict内部维护着一个根据键插入顺序排序的双向链表,对于一个已经存在的键重新赋值,不会改变键的顺序:

>>> d['a'] = 3
>>> d
OrderedDict([('a', 3), ('c', 2), ('e', 3), ('d', 4)])

一个OrderedDict字典比一个普通字典的存储空间大两倍,所以在数据庞大的时候需要考虑空间消耗是否值得
字典的运算
在数据字典中进行求最大值,最小值,排序等运算,首先使用zip()函数将键值反转过来,然后在进行操作

>>> menu = {'红烧排骨':53,'糖醋鱼':46,'锅包肉':33,'鱼香肉丝':28,'干锅土豆片':22,'麻辣小龙虾':78}
>>> min_price = min(zip(menu.values(),menu.keys()))
>>> min_price
(22, '干锅土豆片')
>>> max_price = max(zip(menu.values(),menu.keys()))
>>> max_price
(78, '麻辣小龙虾')

类似,可以用zip()函数与sorted()函数实现排序

>>> sorted(zip(menu.values(),menu.keys()))
[(22, '干锅土豆片'), (28, '鱼香肉丝'), (33, '锅包肉'), (46, '糖醋鱼'), (53, '红烧排骨'), (78, '麻辣小龙虾')]

查找两个字典中的相同键或值
为寻找两个字典的相同点,可以在两个字典的keys()或者items()(注意此处不可以用values()返回结果上执行集合操作,因为值视图不能保证所有值互不相同)返回结果上执行集合操作:

>>> a = {'x':1,'y':2,'z':3}
>>> b = {'a':4,'y':2,'b':1}
>>> a.keys() & b.keys()
{'y'}
>>> a.items() & b.items()
{('y', 2)}
>>> a.items() - b.items()
{('x', 1), ('z', 3)}
>>> a.items() | b.items()
{('x', 1), ('b', 1), ('a', 4), ('y', 2), ('z', 3)}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值