Python字典过滤出内容

Python字典过滤出内容,python,loops,dictionary,iteration,Python,Loops,Dictionary,Iteration,我在班级实验室工作,我有点卡住了,比如我有一本带key和value的字典,这是另一本字典 词典A: dict_a = { 1: { 'Engine': 4, 'Speed': 749, 'max_speed': 1140, 'name': 'Ship1', }, 2: { 'Engine': 2, 'Speed': 600, 'max_speed': 900,

我在班级实验室工作,我有点卡住了,比如我有一本带key和value的字典,这是另一本字典

词典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',
}
此函数应返回一个列表,其中包含值>或等于filter的字典:

这只是一个例子。因为我只需要一个提示如何做这件事。实际上,我的字典很大

到目前为止,我有一个看起来不对劲的问题:

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]

老实说,这部分看起来有点混乱:

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)
k
v
标识符非常棒、简短且惯用。
i
s
的情况就不那么严重了。我猜你在写
过滤
时是指
过滤
。无论如何,我建议您编写一个helper函数,它需要一个谓词
(数据,过滤器)
,当满足过滤条件时返回True。您将能够从循环中单独测试helper函数


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

老实说,这部分看起来有点混乱:

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)
k
v
标识符非常棒、简短且惯用。
i
s
的情况就不那么严重了。我猜你在写
过滤
时是指
过滤
。无论如何,我建议您编写一个helper函数,它需要一个谓词
(数据,过滤器)
,当满足过滤条件时返回True。您将能够从循环中单独测试helper函数

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

您可以尝试以下方法:

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'}}]
{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'}}]
{1: {'Engine': 4, 'max_speed': 1140, 'Speed': 749, 'name': 'Ship1'}, 3: {'Engine': 4, 'max_speed': 1200, 'Speed': 1130, 'name': 'Air_max'}}
您可以尝试以下方法:

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'}}]
{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'}}]
{1: {'Engine': 4, 'max_speed': 1140, 'Speed': 749, 'name': 'Ship1'}, 3: {'Engine': 4, 'max_speed': 1200, 'Speed': 1130, 'name': 'Air_max'}}

如果你必须对字典进行迭代,那么你的“字典”似乎违背了字典的目的。你似乎想要一个
目录的
列表,而不是
目录的
目录,其中键基本上只是索引。你的过滤代码有什么问题?它根本不起作用吗?是不是太慢了?它会产生什么样的结果?@Blurp我得到的是字典列表,而不是经过过滤的。@Moonigrawr不,我不想要回代码,我只想要我做错了什么。以及如何修复它。如果你必须对字典进行迭代,那么你的“字典”似乎违背了字典的目的。你似乎想要一个
dict
s的
列表,而不是
dict
s的
dict
,其中键基本上只是索引。你的过滤代码有什么问题?它根本不起作用吗?是不是太慢了?它会产生什么样的结果?@Blurp我得到的是字典列表,而不是经过过滤的。@Moonigrawr不,我不想要回代码,我只想要我做错了什么。以及如何修复。谢谢你的回答。但如果过滤器dic不是固定的,我的意思是它取决于用户提供dic的键和值。用户可以选择跳过引擎。并且可以将买入价过滤成价值。谢谢你的回答。但如果过滤器dic不是固定的,我的意思是它取决于用户提供dic的键和值。用户可以选择跳过引擎。并且可以将买入价过滤成价值。