一、想按键值索引对字典切片
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