2015-03-02 176 views
-2

删除列表项我有一个嵌套的字典,看起来像这样:嵌套字典

{'Div 4 A Herrar': {'0': {'awayScore': '0', 
          'awayTeam': 'Floda BoIF', 
          'events': [], 
          'homeScore': '0', 
          'homeTeam': 'SKIF Semberijaaaah', 
          'tempTime': '10:00', 
          'time': 'FT'}, 
        '1': {'awayScore': '0', 
          'awayTeam': 'Kode IF', 
          'events': [{'eventID': '3215', 
             'eventScore': '1-0', 
             'eventTime': 'HT', 
             'eventType': 'Goal-timocin', 
             'name': 'timocin', 
             'selectedTeam': 'homeTeam'}, 
            {'eventID': '2312', 
             'eventScore': '2-0', 
             'eventTime': 'HT', 
             'eventType': 'Goal-timocin', 
             'name': 'timocin', 
             'selectedTeam': 'homeTeam'}], 
          'homeScore': '2', 
          'homeTeam': 'Partille IF FK', 
          'tempTime': '11:00', 
          'time': 'FT'}, 
        '2': {'awayScore': '0', 
          'awayTeam': 'Romelanda UF', 
          'events': [], 
          'homeScore': '0', 
          'homeTeam': 'IK Kongah\\u00e4lla', 
          'tempTime': '12:00', 
          'time': 'FT'}}} 

什么,我希望能够做的是在事件删除特定事件名单。我事先知道是前两个键含义:

"Div 4 A Herrar" and the integer number that represents a dictionary item 

我也有在EVENTID为我需要删除的事件。

例如要让它为你更加清晰,可以说,我想与EVENTID 3215删除事件那么我将不得不这些信息能够删除:

"Div 4 A Herrar", 1, 3215' 

如果某样东西不清楚请问,我会更新我的问题更具体。

EDIT1

这就是我只能想到这样做的:

for event in dict["Div 4 A Herrar"][1]["events"]: 
    if(event["eventID"] == "3215"): 
     # this is where i got stuck since i had no idea how to proceed from here. 
+0

您的字典样本已满错误;它不能被粘贴回Python会话中。 – 2015-03-02 15:11:00

+0

为什么你会说当它明显为我工作时它充满了错误?我所做的就是剪掉我更大的词典中的一部分,使它更具可读性,所以我唯一可能忘记的是在最后删除一些括号? @MartijnPieters – 2015-03-02 15:14:31

+3

不要这么饿,投票下来的家伙。这是一个很好的问题,我不知道问题是什么 – 2015-03-02 15:16:09

回答

1
def remove_event(dicts, key, id, event_id): 
    if key in dicts and id in dicts[key] and "events" in dicts[key][id]: 
     dicts[key][id]['events'] = [event for event in dicts[key][id]['events'] 
            if event["eventID"] != event_id] 
    else: 
     raise ValueError("The actual Events could not be found") 

remove_event(data, "Div 4 A Herrar", "1", "3215") 

只是过滤来自events列表时,与列表理解一样,显示在功能以上。这里的关键是,

[event for event in dicts[key][id]["events"] if event["eventID"] != event_id] 

它创建了一个新的列表,通过迭代dicts[key][id]["events"],它包括当前event字典只有在eventeventID是不一样的,你传递给函数的一个。

+0

你知不知道这个更快还是taesu提供的答案 – 2015-03-02 15:44:57

+0

@TimoCengiz用LC创建一个列表发生在C代码内部。所以,我打赌只会在这个代码上。 – thefourtheye 2015-03-02 15:45:56

0
def remove_event(d,d_id,key,event_id): 
    # d = dictionary 
    # d_id = 'Div 4 A Herrar' 
    # key = '1' 
    # event_id = '3215' 

    # create temp list 
    lst = [] 
    # loop the events list 
    for event in d[d_id][key]['events']: 
     # if event_id does not match 
     if event['eventID'] != event_id: 
      # append to temp list 
      lst.append(event) 
    # make that temp list the events list 
    d[d_id][key]['events'] = lst 
+0

我认为你需要在for循环之前定义lst,因为可能有多于1个事件,这意味着每当它循环时lst将是空的@taesu – 2015-03-02 15:43:28

+0

ops,你是对的 – taesu 2015-03-02 15:44:08

+0

我喜欢这个代码,它的工作原理是我会把最正确的答案提交给最快的人。感谢您的时间 – 2015-03-02 15:47:04