2016-09-15 77 views
0

我通過線的Excel文件讀取行創建字典並添加到列表中運行,所以我有這樣的列表:在這種格式更新詞典如果在列表

myList = [] 

和字典:

dictionary = {'name': 'John', 'code': 'code1', 'date': [123,456]} 

所以我這樣做:myList.append(dictionary),迄今爲止這麼好。現在,我將進入下一行我有一個非常相似的字典,其中:

dictionary_two = {'name': 'John', 'code': 'code1', 'date': [789]} 

我想檢查是否我已經有一本字典在myList'name' = 'John',所以我用這個功能檢查:

def checkGuy(dude_name): 
    return any(d['name'] == dude_name for d in myList) 

目前我正在寫這個功能的傢伙添加到列表:

def addGuy(row_info): 
     if not checkGuy(row_info[1]): 
      myList.append({'name':row_info[1],'code':row_info[0],'date':[row_info[2]]}) 
     else: 
      #HELP HERE 
在這個

別的我想dict.update(updated_dict)但我不知道如何在這裏得到字典。

有人可以幫助dictionary追加值dictionary_two

+2

爲什麼不只是讓'myList'成爲一個字典,其關鍵是名字? – Barmar

+0

你可以讓'checkGuy'返回匹配的元素,而不僅僅是一個布爾值。如果它返回一個字典,則更新它,否則你會追加新的字典。 – Barmar

+0

@Barmar因爲有更多的名字,我想它會更多地組織在一起的字典列表。我也想過讓字典格式成爲一個班級,但我現在不太願意在這個時候處理對象。編輯:這實際上不是一個壞主意...... – Onilol

回答

2

我將修改checkGuy喜歡的東西:

def findGuy(dude_name): 
    for d in myList: 
     if d['name'] == dude_name: 
      return d 
    else: 
     return None # or use pass 

然後執行:

def addGuy(row_info): 
    guy = findGuy(row_info[1]) 
    if guy is None: 
     myList.append({'name':row_info[1],'code':row_info[0],'date':[row_info[2]]}) 
    else: 
     guy.update(updated_dict) 
+0

爲什麼要返回'i'而不是'd'? – Barmar

+0

@Barmar我認爲可以很容易地交換,而不是更新 –

+0

行,這是一個公平點。這是更一般的。 – Barmar

0

這個答案建議粘貼在它被提出的意見,如果「名」是唯一條件搜索,那麼它可以用作字典中的鍵而不是使用列表。

master = {"John" : {'code': 'code1', 'date': [123,456]}} 

def addGuy(row_info): 
    key = row_info[1] 
    code = row_info[0] 
    date = row_info[2] 
    if master.get(key): 
     master.get(key).update({"code": code, "date": date}) 
    else: 
     master[key] = {"code": code, "date": date} 
+0

爲什麼投票完全沒有?答案是迴應評論中的請求,用字典而不是列表來說明答案。 – Will

+0

這跟剛剛做master [key] = {「code」:code,「date」:date}'一樣,更新覆蓋,所以最終會一樣。 –

+0

我更新了問題 – Onilol

0

如果dict.update每次看到重複的名字時現有的數據,你的代碼可以降低到類型的字典就在你閱讀文件的字典。使用相同的密鑰調用現有的dicts更新將覆蓋最後一次出現的值,即使您有多個「John」字典,它們最終都會包含完全相同的數據。

def read_file(): 
    results = {name: {"code": code, "date": date} 
       for code, name, date in how_you_read_into_rows} 

如果您確實認爲值以某種方式被追加,那麼您就錯了。如果你想這樣做,你需要一個非常不同的方法。如果你真的要收集每個用戶的日期和代碼,然後用defauldict附加代碼,日期對到一個列表的名稱作爲關鍵字:

from collections import defaultdict 
d = defaultdict(list) 
def read_file(): 
    for code, name, date in how_you_read_into_rows: 
     d["name"].append([code, date]) 

或者一些變化取決於你想要的是什麼最終輸出看起來像。