首页 > 解决方案 > 如何根据条件删除python有序字典中的子键、值对?

问题描述

我有一个 python 字典,每个键内都有一个有序字典,有超过 1000 万个键、子键、值对。我想根据数字条件删除子键及其值,并且想知道如何以有效的方式做到这一点。

#My input dictionary 

dict = {'Math': OrderedDict([('John', 0.0),
              ('Peter', 22.2222),
              ('Alex', 60.212),
              ('Ben', 82.19)]),
 'Physics': OrderedDict([('John', 92.25),
              ('Peter', 35.22),
              ('Alex', 18.22),
              ('Ben', 76.19)]),
 'Chemistry': OrderedDict([('John', 19),
              ('Peter', 24),
              ('Alex', 6),
              ('Ben', 100)])
 }

#I want my output to delete subkey pairs where value is less than 20, for eg.
out_dict = {'Math': OrderedDict([('Peter', 22.2222),              
              ('Alex', 60.212),
              ('Ben', 82.19)]),
 'Physics': OrderedDict([('John', 92.25),
              ('Peter', 35.22),
              ('Ben', 76.19)]),
 'Chemistry': OrderedDict([('Peter', 24),
              ('Ben', 100)])
 }

我努力了:

for key in [key for key in dict if key>=20]: 
    del dict[key] 

我收到了一个 TypeError。

标签: pythonpandas

解决方案


这是熊猫的解决方案,因为它在标签列表中:

import pandas as pd
from collections import OrderedDict

d = {'Math': OrderedDict([('John', 0.0), ('Peter', 22.2222), ('Alex', 60.212), ('Ben', 82.19)]),
     'Physics': OrderedDict([('John', 92.25), ('Peter', 35.22), ('Alex', 18.22), ('Ben', 76.19)]),
     'Chemistry': OrderedDict([('John', 19), ('Peter', 24), ('Alex', 6), ('Ben', 100)])
     }

df2 = pd.DataFrame(d)
thedict = {} 
for x,y in df2.unstack()[df2.unstack()>20].items(): 
  thedict[x[0]] = [] 
for x,y in df2.unstack()[df2.unstack()>20].items(): 
  thedict[x[0]].append((x[1],y)) 
for k,y in thedict.items(): 
  thedict[k] = OrderedDict(y) 

输出:

thedict                                                                                                                                                                                          

{'Math': OrderedDict([('Peter', 22.2222), ('Alex', 60.212), ('Ben', 82.19)]),
 'Physics': OrderedDict([('John', 92.25), ('Peter', 35.22), ('Ben', 76.19)]),
 'Chemistry': OrderedDict([('Peter', 24.0), ('Ben', 100.0)])}

推荐阅读