关于python:如何使用重叠键扩展特定字典项的值?

How do I extend the values of a specific dictionary item with overlapping keys?

本问题已经有最佳答案,请猛点这里访问。

所以我有一本字典"db",它等于

1
2
3
4
{('ALI', 'MALE'): [(2011, 200, None), (2012, 200, None), (2013, 200, None),
(2014, 200, None), (2015, 200, None)], ('BOB', 'MALE'): [(2012, 200, None),
(2013, 200, None), (2014, 200, None)], ('LUKE', 'MALE'): [(2013, 200, None),
(2015, 200, None)], ('JEFF', 'MALE'): [(2014, 200, None)]}

我需要创建一个函数来获取数据库、名称、性别、年份、计数和排名(有时可能等于无),并用新信息更新字典数据库。这是我到目前为止所拥有的。

1
2
3
def add_name(db, name, gender, year, count, rank=None):
    db.update({(name, gender): [(year, count, rank)]})
    return None

但是,问题是,如果我添加一个在db中已经存在键的项,例如"('bob','male')",则.update方法将覆盖与该键关联的值,并用函数中的值替换它们。

如果键重叠,如何简单地追加值?


您可以使用setdefault

1
2
3
def add_name(db, name, gender, year, count, rank=None):
    db.setdefault((name, gender), []).append((year, count, rank))
    return None

或者使用defaultdict开始:

1
2
3
4
5
6
from collections import defaultdict
db = defaultdict(list)

def add_name(db, name, gender, year, count, rank=None):
    db[(name, gender)].append((year, count, rank))
    return None


如果要扩展列表,则需要访问dict键并附加到现有列表:

1
2
3
4
5
def add_name(db, name, gender, year, count, rank=None):
    if (db, name) in db:
        db[(name, gender)].append((year, count, rank))
    else:
        db.update({(name, gender): [(year, count, rank)]})

这将检查数据库中是否存在该项,如果存在,则追加该项。顺便问一下,你为什么还None?您不必从函数返回某些内容


试试这个:

1
2
3
4
5
6
7
8
def add_name(db, name, gender, year, count, rank=None):
    # check if the key (name, gender) in db. if it's in, append
    if (name, gender) in db:
        db[(name, gender)].append((year, count, rank))
    # else new a key
    else:
        db[(name, gender)] = [(year, count, rank)]
    return None