Python在列表中查找对象

11 投票
5 回答
49944 浏览
提问于 2025-04-16 12:32

我有一个人名的列表:

[
    {'name' : 'John', 'wins' : 10 },
    {'name' : 'Sally', 'wins' : 0 },
    {'name' : 'Fred', 'wins' : 3 },
    {'name' : 'Mary', 'wins' : 6 }
]

我正在通过一个名字列表(['Fred', 'Mary', 'Sally'])来添加胜利记录。我不确定这个名字是否已经在我的人名列表里,如果没有的话,我需要插入一个新的记录。目前我这样做:

name = 'John'
person = None
pidx = None
for p in people_list:
    if p['name'] == name:
        person = p
        pidx = people_list.index(p)
        break
if person is None:
    person = {'name' : name, 'wins' : 0}
person['wins'] += 1
if pidx is None:
    people_list.append(person)
else
    people_list[pidx] = person

有没有更好的方法来处理这个列表呢?因为我把这些数据保存到MongoDB里,所以我不能用dict,因为那样会保存成一个对象,而我想使用一些原生的数组功能来进行排序和映射,这些功能在对象上是无法使用的。

5 个回答

7

如果你不想一直使用一个字典,那就暂时用一个吧。

people = [
    {'name' : 'John', 'wins' : 10 },
    {'name' : 'Sally', 'wins' : 0 },
    {'name' : 'Fred', 'wins' : 3 },
    {'name' : 'Mary', 'wins' : 6 }
]

wins = ['Fred', 'Mary', 'Sally']

people_dict = dict((p["name"], p) for p in people)

for winner in wins:
    people_dict[winner].setdefault("wins", 0)
    people_dict[winner]["wins"] += 1

people = people_dict.values()
9

是的,使用字典。

wins = {}
for name in winners:
    wins.setdefault(name, 0)
    wins[name] += 1

补充:

index = {}
for name in wins:
    person = index.setdefault(name, { 'name' : name, 'wins': 0 })
    if person['wins'] == 0:
        person_list.append(person)
    person['wins'] += 1
14

我假设你不想使用除了列表以外的其他结构。你的代码应该是可以工作的,不过你在更新字典后又把它写回列表,这其实是多余的。字典是通过引用来复制的,所以一旦你更新了字典,它在列表中的内容也会自动更新。经过一些整理后,你的代码可以变成这样:

def add_win(people_list, name):
    person = find_person(people_list, name)
    person['wins'] += 1

def find_person(people_list, name):
    for person in people_list:
        if person['name'] == name:
            return person
    person = {'name': name, 'wins': 0}
    people_list.append(person)
    return person

撰写回答