Python 基于第二个字典中的值筛选字典
两个字典列表是class1和class2,如下所述Python 基于第二个字典中的值筛选字典,python,dictionary,Python,Dictionary,两个字典列表是class1和class2,如下所述 class1 =[{'name':3450,'val':0.3298},{'name':2250,'val':0.3278},{'name':4380,'val':0.38732},{'name':8450,'val':0.27824}] class2 =[{'name':2250,'cutoff':0.3},{'name':3450,'cutoff':0.6},{'name':8450,'cutoff':0.9},{'name':4380,
class1 =[{'name':3450,'val':0.3298},{'name':2250,'val':0.3278},{'name':4380,'val':0.38732},{'name':8450,'val':0.27824}]
class2 =[{'name':2250,'cutoff':0.3},{'name':3450,'cutoff':0.6},{'name':8450,'cutoff':0.9},{'name':4380,'cutoff':0.2}]
所以我想在以上两个字典中创建第三个字典作为FilteredClass
如果class1中的“val”大于class2中的“cutoff”,那么我想将其添加到class1字典列表中,如下所示
filteredClasses =[{'name':2250,'val':0.3278},{'name':4380,'val':0.38732}]
请帮我写一个有效的代码。我不熟悉编程,也不熟悉python及其数据类型,我尝试了以下方法
for n in class1:
if n['name'] == class2['name']:
filteredClasses = [ class1['val'] > class2['cutoff'] ]
我知道我在上面的代码中是不合逻辑的,但我想你明白我的意思了。请帮我修一下
filteredclass = [x for x in class1 if x['val'] > [y for y in class2 if x['name'] == y['name']][0]['cutoff']]
结果
这里有一个循环,将完成这项任务,希望这有帮助
for i in class1:
for j in class2:
if i['name'] == j['name']:
try:
if i['val'] > j['cutoff']:
if i not in filtered:
filtered.append(i)
except TypeError:
pass
print(filtered)
输出
这是另一种避免踩踏的方法
filteredClasses = [each for each in class1 for each2 in class2 if each["name"] == each2["name"] and each["val"] > each2["cutoff"]]
# O(len(class1)*len(class2))
如果您愿意使用第三方库,Pandas提供了一个高效的解决方案。这是因为字典列表可以直接提供给
pd.DataFrame
构造函数。可通过将反向过程应用到dict
:
import pandas as pd
# read lists of dictionaries into a dataframe and series
df = pd.DataFrame(class1)
s = pd.DataFrame(class2).set_index('name')['cutoff']
# use Boolean filtering on dataframe
res = df[df['val'] > df['name'].map(s)]
# extract list of dictionaries for desired result
print(res.to_dict('records'))
[{'name': 2250.0, 'val': 0.3278},
{'name': 4380.0, 'val': 0.38732}]
class1和class2不是字典。它们是字典列表。看起来你得到了一大堆答案。如果有人解决了您的问题,请单击绿色复选标记接受。谢谢值得赞赏的是,我做到了,我对堆栈溢出还不熟悉。
(xenial)vash@localhost:~/python$ python3.7 filer.py
[{'name': 2250, 'val': 0.3278}, {'name': 4380, 'val': 0.38732}]
filteredClasses = [each for each in class1 for each2 in class2 if each["name"] == each2["name"] and each["val"] > each2["cutoff"]]
# O(len(class1)*len(class2))
import pandas as pd
# read lists of dictionaries into a dataframe and series
df = pd.DataFrame(class1)
s = pd.DataFrame(class2).set_index('name')['cutoff']
# use Boolean filtering on dataframe
res = df[df['val'] > df['name'].map(s)]
# extract list of dictionaries for desired result
print(res.to_dict('records'))
[{'name': 2250.0, 'val': 0.3278},
{'name': 4380.0, 'val': 0.38732}]