使用dict理解删除嵌套dict项

2024-04-25 01:00:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个口述:

blocked = {'-5.00': ['121', '381']}
all_odds = {'-5.00': '{"121":[1.85,1.85],"381":[2.18,1.73],"16":[2.18,1.61],"18":\
            [2.12,1.79]}'}

我想首先检查.keys()比较(==)是否返回True,这里是这样的(两者都是-5.00),然后我想从all_odds中删除键列在blocked.values()中的所有项。在

对于上述情况,应导致:

^{pr2}$

我试过for loop

if blocked.keys() == all_odds.keys():
    for value in blocked.values():
        for v in value:
            for val in all_odds.values():
                val = eval(val)
                if val.has_key(v):
                    del val[v] 

你知道它很难看,而且还不能正常工作。在


Tags: inlooptrueforifvaluevalkeys
3条回答

这似乎有效:

blocked = {'-5.00': ['121', '381']}
all_odds = {'-5.00': {"121":[1.85,1.85],"381":[2.18,1.73],"16":[2.18,1.61],"18":\
        [2.12,1.79]}}
all_odds_final = dict(all_odds)
for key, blocks in blocked.iteritems():
    map(all_odds_final[key].pop,blocks,[])

如果您不想复制字典,您可以从原始的all-Lords字典中弹出项目:

^{pr2}$

map函数中的空列表是这样的,pop被调用时没有作为它的第二个参数。没有它,pop只得到一个参数,如果键不存在,它将返回一个错误。在

以下是如何在2行中完成相同的操作。我不打算在这里使用ast或eval,但如果您想使用它,可以添加它。在

>>> blocked = {'-5.00': ['121', '381']}
>>> all_odds = {'-5.00': {'121':[1.85,1.85],'381':[2.18,1.73],'16':[2.18,1.61],'18':\
...      [2.12,1.79]}}
>>> bkeys = [k for k in all_odds.keys() if k in blocked.keys()]
>>> all_odds_final = {pk: {k:v for k,v in all_odds.get(pk).items() if k not in blocked.get(pk)} for pk in bkeys}
>>> all_odds_final
{'-5.00': {'18': [2.12, 1.79], '16': [2.18, 1.61]}}

首先,用^{}使字符串成为字典。Don't use ^{}

>>> import ast
>>> all_odds['-5.00'] = ast.literal_eval(all_odds['-5.00'])

然后你可以使用字典理解:

^{pr2}$

但是如果你想把-5.00的值作为一个字符串。。。在

^{3}$

相关问题 更多 >