如果在列表中更新字典

时间:2016-09-15 20:33:56

标签: python dictionary

我正在逐行阅读excel文件来创建词典并将它们附加到列表中,所以我有一个列表如下:

myList = []

和这种格式的字典:

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

所以我这样做:myList.append(dictionary),到目前为止一切顺利。现在我进入下一行,我有一个非常相似的词典:

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

我想检查'name' = 'John'中是否已有myList字典,所以我使用此功能检查:

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的值吗?

3 个答案:

答案 0 :(得分: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)

答案 1 :(得分:0)

这个答案建议粘贴在评论中,建议如果“name”是唯一可以搜索的标准,那么它可以用作字典中的键而不是列表。

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}

答案 2 :(得分: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])

或者某些变化取决于您希望最终输出的样子。