如何根据其嵌套字典中的键删除字典

lin*_*nus 0 python dictionary for-loop nested list

我有以下数据结构:

data = [{"match_id":1, "players":[{"player_name":"Tom", "won":True},
                                  {"player_name":"Anna", "won":False}]}, 
        {"match_id":2, "players":[{"player_name":"Tom", "won":None},
                                  {"player_name":"Fred", "won":None}]}]
Run Code Online (Sandbox Code Playgroud)

我的目标是定义一个函数来删除没有玩家获胜的比赛 (i.e. "won":None)

对于上面给定的示例,输出应如下所示:

data = [{"match_id":1, "players":[{"player_name":"Tom", "won":True},
                                  {"player_name":"Anna", "won":False}]}]
Run Code Online (Sandbox Code Playgroud)

我尝试了以下方法:

def delete_None(data):
result = []
for match in data:
    for players in match['players']:
        if players['won'] == None:
            del data_nt[match]
return result
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

TypeError                                 Traceback (most recent call last)
<ipython-input-21-a259efc7b5fa> in <module>
----> 1 data_nt_nn = delete_None(data)

<ipython-input-20-68ffe18e4fff> in delete_None(data_nt)
      4         for players in match['players']:
      5             if players['won'] == None:
----> 6                 del data_nt[match]
      7     return result
      8 

TypeError: list indices must be integers or slices, not dict
Run Code Online (Sandbox Code Playgroud)

我感谢任何帮助,谢谢。

Meh*_*far 6

仅在一行中尝试此操作:

data = [d for d in data if not all(p['won'] is None for p in d['players'])]
Run Code Online (Sandbox Code Playgroud)

这也将有助于获得算法

key_to_removes = [] 
for i,d in enumerate(data): 
    if all(p['won'] is None for p in d['players']): 
        key_to_removes.append(i) 
Run Code Online (Sandbox Code Playgroud)

然后key_to_removes将是

[1]
Run Code Online (Sandbox Code Playgroud)

然后您可以从数据中删除索引。