c++ 字典_Python字典技巧一锅炖与避坑指南

点击上方   编程学习者社区,选择   创建星标

回复关键字   资源   获取编程资料

d2a3203f79c08efb052529c07a454a51.png


在Python的使用中,字典是一个基础且使用率报表的数据类型。

字典的创建与初始化

#创建一个字典
a={}
b=dict()"""
我们常初在始化空字典时,使用到上面两种方式。
如果我们在字典创建的同时需要赋值呢?
"""# 普通的方式
a={'a':1,'b':'to','c':'63'}# 更优雅的赋值
b=dict(a=1,b='to',c='63')"""不管从重复输入的引号上,还是从输入方便考虑,你都该选择后者
再深入一下,如果我们现在有四个人,
需要统计他们的工资,初始没人都是10000,该如何创建?
按照上面的dict(x=y)没错,但批量的初始化,你应该使用更优雅的方式:
"""
names=["zhang","wang","li","zhao"]# 普通方式
users = dict(zhang=10000,wang=10000,li=10000,zhao=10000)# 更优雅的方式
user1=dict().fromkeys(names,10000)

获取字典的值

a={'a':1,'b':'to','c':'63'}
a['b']>>> output: to"""
上面的这种value值获取方式较为常见,但如果a中没有b,
或者在字典的使用过程中b 这个key被del了呢?
这是会报一个KeyError的错误,所以养成好习惯,使用下面的方式
当key值不存在时,返回none,或者自定义一个默认值。
"""
a.get('b',[default_no可选...])

说说更新与删除

#  更新
a={'a':1,'b':'to','c':'63'}
a.update({'a':2})
a.update(a=2) # 这种方式同样适用与更新操作# 删除某个键值对del a['a']
pop('a')"""
两者都可以达到删除某个键值对的操作,
但后者相当于去除后删除,具备返回值
"""del a 删除字典a
a.clear()清空字典a

判断has_key操作

"""
python2中,判断字典是否存在某个值,可以使用has_key('key'),
但在python3中取消了该参数,如果我们想判断可以使用以下方式:
"""
a={'a':1,'b':'to','c':'63'}'b' in a.keys()
a.__contains__('b')

使用enumerate,优雅的输出字典

a = {'a': 1, 'b': 'to', 'c': '63'}for line, item in enumerate(a.items(), start=1):
print("[{}] {} --> {}".format(line, *item))>>> output:"""
[1] a --> 1
[2] b --> to
[3] c --> 63
"""

OrderedDict的使用

我们知道默认的dict(字典)是无序的,但是在某些情形我们需要保持dict的有序性,这个时候可以使用OrderedDict,它是dict的一个subclass(子类),但是在dict的基础上保持了dict的有序型,下面我们来看一下使用方法。

example1:
>>> from collections import OrderedDict# 无序的dict>>> d = {'banana': 3, 'apple': 4, 'pear': 1, 'orange': 2}
这是一个无序的dict(字典),现在我们可以使用OrderedDict来让这个dict变得有序。# 将d按照key来排序>>> OrderedDict(sorted(d.items(), key=lambda t: t[0]))
OrderedDict([('apple', 4), ('banana', 3), ('orange', 2), ('pear', 1)])# 将d按照value来排序>>> OrderedDict(sorted(d.items(), key=lambda t: t[1]))
OrderedDict([('pear', 1), ('orange', 2), ('banana', 3), ('apple', 4)])# 将d按照key的长度来排序>>> OrderedDict(sorted(d.items(), key=lambda t: len(t[0])))
OrderedDict([('pear', 1), ('apple', 4), ('orange', 2), ('banana', 3)])
example2:
"""
使用popitem(last=True)让我们按照LIFO(先进后出)顺序删除dict中的key-value,
即删除最后插入的键值对,如果last=False就按照FIFO删除dict中key-value。
""">>> d = {'banana': 3, 'apple': 4, 'pear': 1, 'orange': 2}# 将d按照key来排序>>> d = OrderedDict(sorted(d.items(), key=lambda t: t[0]))>>> d
OrderedDict([('apple', 4), ('banana', 3), ('orange', 2), ('pear', 1)])# 使用popitem()方法来移除最后一个key-value对>>> d.popitem()
('pear', 1)# 使用popitem(last=False)来移除第一个key-value对>>> d.popitem(last=False)
('apple', 4)
example3:
"""
使用move_to_end(key,last=True)来改变有序OrderedDict的key-value顺序,通过这个方法我们可以将排序好的OrderedDict对象中的任意一个key-value,插入到字典的开头或者结尾。""">>> d = OrderedDict.fromkeys('abcd')>>> d
OrderedDict([('a', None), ('b', None), ('c', None), ('d', None)])# 将key为b的key-value对移动到dict的最后>>> d.move_to_end('b')>>> d
OrderedDict([('a', None), ('c', None), ('d', None), ('b', None)])>>> ''.join(d.keys())'acdeb'# 将key为b的key-value对移动到dict的最前面>>> d.move_to_end('b', last=False)>>> ''.join(d.keys())'bacde'

关于字典的坑

让我们先来看这样一个例子:

default_dict ={1:1,2:2}output:

我们预期的是在初始的字典中,插入一个key为1.0的值,但是为何却更新了原始key为1的值呢?

因为,python字典的key存储时,比较哈希值来确定两个键是否相同的,比如:

hash(1)==hash(1.0)
True

你以为只有字典存在这个问题么?列表亦如此!

>>> index_list = [1,2,3]
>>> 2.0 in index_list
True

对于这些隐藏的bug,你必须时刻牢记,不然坑你没商量....


来源:清风Python
作者:王翔

往期精选

  • 在知乎上学Python-入门篇

  • 在知乎上学爬虫

  • 大家都用什么背英语单词

  • Python库分享

4ddebba4ef91070f98df703d4d467266.png

7cae4edf0ecb6b932b6538cf8da6aa4a.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值