Python词典过滤掉的东西

时间:2017-11-24 19:47:14

标签: python loops dictionary iteration

我在班级实验室工作,我有点卡住了,例如我有一本带有键和值的词典,这是另一本词典。

字典A:

dict_a = {
    1: {
        'Engine': 4,
        'Speed': 749,
        'max_speed': 1140,
        'name': 'Ship1',
    },

    2: {
        'Engine': 2,
        'Speed': 600,
        'max_speed': 900,
        'name': 'B777',
    },

    3: {
        'Engine': 4,
        'Speed': 1130,
        'max_speed': 1200,
        'name': 'Air_max',
    }
}

我正在尝试编写一个函数,它将采用两个参数(字典A和一个过滤字典)例如:

filter = {
    'Engine' :4,
    'name': 'Air_max',
}

此函数应返回包含值> gt的词典的列表。或等于过滤器:

这只是一个例子。因为我只需要一个提示想法如何做到这一点。实际上我的词典A非常大。

到目前为止,我认为这看起来不对:

filtered = {
    'Engine':   2,
    'Speed':  300,
    'Type': 'Electric'
}

result = []
for k, v in full_data.items():
    for i, s in v.items():
        for a, b in filtered.items():
            if v[i] >= filtered[a]:
                result.append(v)
filtered_result = []
for each in result:
    if each not in filtered_result:
        filtered_result.append(each)
filtered_result[:3]

2 个答案:

答案 0 :(得分:0)

老实说,这部分似乎有点混乱:

for k, v in full_data.items():
    for i, s in v.items():
        for a, b in filtered.items():
            if v[i] >= filtered[a]:
                result.append(v)

kv标识符非常棒,简短且惯用。 is个,不那么重要。当你写filter时,我怀疑你的意思是filtered。无论如何,我建议你编写一个辅助函数,一个谓词is_wanted(data, filter),当满足过滤条件时返回True。您将能够从循环中单独测试辅助函数。

然后返回到现在调用谓词的循环,并考虑为变量提供更多描述性名称。总的来说,你似乎走在了正确的轨道上。

答案 1 :(得分:0)

你可以试试这个:

filter = {
'Engine' :4,
'name': 'Air_max',
}
new_dict_a = [{a:b} for a, b in dict_a.items() if b['Engine'] >= filter['Engine']]

输出:

[{1: {'Engine': 4, 'max_speed': 1140, 'Speed': 749, 'name': 'Ship1'}}, {3: {'Engine': 4, 'max_speed': 1200, 'Speed': 1130, 'name': 'Air_max'}}]

如果您想要字典而不是列表:

new_dict_a = {a:b for a, b in dict_a.items() if b['Engine'] >= filter['Engine']}

输出:

{1: {'Engine': 4, 'max_speed': 1140, 'Speed': 749, 'name': 'Ship1'}, 3: {'Engine': 4, 'max_speed': 1200, 'Speed': 1130, 'name': 'Air_max'}}