字典的操作

一、想按键值索引对字典切片

参考

def dict_slice(adict, start, end):
    keys = adict.keys()
    dict_slice = {}
    for k in list(keys)[start:end]:
        dict_slice[k] = adict[k]
    return dict_slice

dict_slice(char_to_idx,1,10)

在这里插入图片描述

输出
{‘慈’: 1, ‘饮’: 2, ‘地’: 3, ‘箱’: 4, ‘城’: 5, ‘挣’: 6, ‘值’: 7, ‘瞰’: 8, ‘阿’: 9}

二、想取出特定键值的子字典

参考

例如:字典按{日期:列表}方式构成,日期是Key,字典: buy
‘2018-01-05’: [a1,a2,a3]
‘2018-01-06’: [a3,a5,a6,a9]
…
‘2019-01-04’:[a1,a2,a6,a10]
‘2019-01-05’:[a3,a4]
…
‘2019-04-04’:[a3,a7,a11,a12,a13]
…
‘2019-07-24’:[a5,a10,a11,a18,a19]

想要做2019-01-04到2019-04-04切片
stratTime=2019-01-04
endTime=2019-04-04
list_buy=list(buy.keys())
key=list_buy[list_buy.index(stratTime):list_buy.index(endTime)]
buy_subdict = {k: buy[k] for k in key}
print(‘buy part’,buy_subdict)


buy_subdict 就是切片后的字典
输出
‘2019-01-04’:[a1,a2,a6,a10]
‘2019-01-05’:[a3,a4]

‘2019-04-04’:[a3,a7,a11,a12,a13]

三、想取出特定范围内键值的子字典

b的类型是:<class ‘dict’>

b= {0:'aa',2:'bb',3:'cc',4:'dd',6:'rr'}
b_keys = list(b.keys())
print(b_keys)
startTime = 1
endTime = 5

clip_b = sorted([(k,v) for k,v in b.items() if k in range(1,5+1)])
print(clip_b)

输出
[0, 2, 3, 4, 6]
[(2, ‘bb’), (3, ‘cc’), (4, ‘dd’)]

输出得到的子切片类型是:<class ‘list’>

如果我还是想把它再变为字典呢?
d1 = {(it[0]):it[1] for it in clip_b}
print(d1,type(d1))

> 输出
> {2: 'bb', 3: 'cc', 4: 'dd'} <class 'dict'>

但这种字典容易存在miss_key的错误,即当我们通过键访问字典,如果键不存在将会返回KeyError错误,如何避免这种错误?这时候可以把dict类型转换为collections.defaultdict类型。当此键值不存在时,当字典中没有的键第一次出现时,default_factory自动为其返回一个空列表,list.append()会将值添加进新列表;再次遇到相同的键时,list.append()将其它值再添加进该列表。
代码:

from collections import defaultdict
s=[(2, 'bb'), (4, 'cc'), (6, 'dd')]
d=defaultdict(list)
for k, v in s:
    d[k].append(v)
print(d)
# a=sorted(d.items())
print(type(d))

for timing in range(0, 8, 1):
    print(d[timing])

输出:
defaultdict(<class ‘list’>, {2: [‘bb’], 4: [‘cc’], 6: [‘dd’]})
<class ‘collections.defaultdict’>
[]
[]
[‘bb’]
[]
[‘cc’]
[]
[‘dd’]
[]

四、想取出字典最大值的那个键值

b = {1:5 , 2:0 ,3:4}
k_max_val= sorted([(k,v) for k,v in b.items() if k in [1,2,3]])[0][0]

输出
k_max_val = 1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值