Python在列表中查找对象

Jos*_*h K 9 python indexing search list

我有一份人员名单:

[
    {'name' : 'John', 'wins' : 10 },
    {'name' : 'Sally', 'wins' : 0 },
    {'name' : 'Fred', 'wins' : 3 },
    {'name' : 'Mary', 'wins' : 6 }
]
Run Code Online (Sandbox Code Playgroud)

我正在使用名单列表添加胜利(['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
Run Code Online (Sandbox Code Playgroud)

使用列表有更好的方法吗?鉴于我将此保存到MongoDB,我不能使用它dict,因为它将保存为对象,我想使用本机数组函数进行对象不可用的排序和映射.

Dzi*_*inX 13

我在这里假设你不想使用除列表之外的任何结构.您的代码应该可以工作,尽管您在更新后不必要地将字典写回列表.字典是通过引用复制的,因此一旦更新它,它就会在列表中保持更新状态.稍微整理一下后,您的代码可能如下所示:

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
Run Code Online (Sandbox Code Playgroud)


tan*_*orm 9

是的,使用字典.

wins = {}
for name in winners:
    wins.setdefault(name, 0)
    wins[name] += 1
Run Code Online (Sandbox Code Playgroud)

编辑:

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


Ste*_*ger 6

如果你不想让dict永久使用一个.

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()
Run Code Online (Sandbox Code Playgroud)