Python 基于第二个字典中的值筛选字典

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和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,'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}]