簡體   English   中英

使用dict理解移除嵌套的dict項

[英]Removing nested dict items with dict comprehension

我有兩個決定:

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()列出的鍵的項。

對於上述情況,應導致:

all_odds_final = {'-5.00': '{"16":[2.18,1.61],"18": [2.12,1.79]}'}

我嘗試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] 

您知道這很丑陋,而且無法正常工作。

首先,使用ast.literal_eval()使字符串成為字典。 不要使用eval()

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

然后,您可以使用字典理解:

>>> if blocked.keys() == all_odds.keys():
...     print {blocked.keys()[0] : {k:v for k, v in all_odds.values()[0].iteritems() if k not in blocked.values()[0]}}
... 
{'-5.00': {'18': [2.12, 1.79], '16': [2.18, 1.61]}}

但是如果您希望將-5.00的值作為字符串...

>>> {blocked.keys()[0]:str({k: v for k, v in all_odds.values()[0].iteritems() if k not in blocked.values()[0]})}
{'-5.00': "{'18': [2.12, 1.79], '16': [2.18, 1.61]}"}

這是大約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]}}

這似乎可行:

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_odds字典中彈出項目:

for key, blocks in blocked.iteritems():
    map(all_odds[key].pop,blocks,[])

map函數中的空列表是如此,因此pop被調用None作為第二個參數。 如果沒有它,則pop僅獲得一個參數,如果不存在該鍵,則將返回錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM