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)
我感谢任何帮助,谢谢。
仅在一行中尝试此操作:
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)
然后您可以从数据中删除索引。