2015-03-02 175 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