繁体   English   中英

Python3在列表中的字典中查找值

[英]Python3 Find value in a dictionary within a list

我创建了一个 function,我在其中将人员及其可用性添加到名为游戏玩家的列表中。 我希望 function 有两个例外。 如果此人忘记添加他们的姓名或他们的可用性,我将打印:“玩家缺少关键信息”

如果名称已经在列表中,我也希望出现错误并打印:“此名称已存在”

但是我似乎找不到在列表中获取值字典 [“name”] 的方法。

我也试过 gamers[0]["name"] 但这没有用。

gamers = []

def add_gamer(gamer, gamers):
    if gamer.get("name") and gamer.get("availability"):
        gamers.append(gamer)
    elif gamers["name"] in gamers:                      #Here is the problem
        print("This name already exists")
    else:
        print("Gamer missing critical information")
    return gamers

kimberly = {
    'name': "Kimberly Warner",
    'availability': ["Monday", "Tuesday", "Friday"]
}
print(add_gamer(kimberly, gamers))

add_gamer({'name':'Thomas Nelson','availability': ["Tuesday", "Thursday", "Saturday"]}, gamers)
add_gamer({'name':'Joyce Sellers','availability': ["Monday", "Wednesday", "Friday", "Saturday"]}, gamers)
add_gamer({'name':'Michelle Reyes','availability': ["Wednesday", "Thursday", "Sunday"]}, gamers)
add_gamer({'name':'Stephen Adams','availability': ["Thursday", "Saturday"]}, gamers)
add_gamer({'name': 'Joanne Lynn', 'availability': ["Monday", "Thursday"]}, gamers)
add_gamer({'name':'Latasha Bryan','availability': ["Monday", "Sunday"]}, gamers)
add_gamer({'name':'Crystal Brewer','availability': ["Thursday", "Friday", "Saturday"]}, gamers)
add_gamer({'name':'James Barnes Jr.','availability': ["Tuesday", "Wednesday", "Thursday", "Sunday"]}, gamers)
add_gamer({'name':'Michel Trujillo','availability': ["Monday", "Tuesday", "Wednesday"]}, gamers)


add_gamer({'name':'Thomas Nelson','availability': ["Tuesday", "Thursday", "Saturday"]}, gamers)
print(gamers)

#this last line (which ads Thomas Nelson) should return: "This name is already in the list"

尝试切换顺序并检查:

if any(g['name'] == gamer["name"] for g in gamers):
    print("This name already exists")
elif gamer.get("name") and gamer.get("availability"):
    gamers.append(gamer)
    

在您的代码中,您首先附加元素,然后检查它是否存在。 所以, efif 部分基本上什么都不做。 所以,改变它的顺序。

gamers = []

def add_gamer(gamer, gamers):
    for gam in gamers:
        if gam['name'] == gamer['name']:#Here is the problem
            print("This name already exists")
            return gamers
    if gamer.get("name") and gamer.get("availability"):
        gamers.append(gamer)
    else:
        print("Gamer missing critical information")
    return gamers

kimberly = {
    'name': "Kimberly Warner",
    'availability': ["Monday", "Tuesday", "Friday"]
}
print(add_gamer(kimberly, gamers))

add_gamer({'name':'Thomas Nelson','availability': ["Tuesday", "Thursday", "Saturday"]}, gamers)
add_gamer({'name':'Joyce Sellers','availability': ["Monday", "Wednesday", "Friday", "Saturday"]}, gamers)
add_gamer({'name':'Michelle Reyes','availability': ["Wednesday", "Thursday", "Sunday"]}, gamers)
add_gamer({'name':'Stephen Adams','availability': ["Thursday", "Saturday"]}, gamers)
add_gamer({'name': 'Joanne Lynn', 'availability': ["Monday", "Thursday"]}, gamers)
add_gamer({'name':'Latasha Bryan','availability': ["Monday", "Sunday"]}, gamers)
add_gamer({'name':'Crystal Brewer','availability': ["Thursday", "Friday", "Saturday"]}, gamers)
add_gamer({'name':'James Barnes Jr.','availability': ["Tuesday", "Wednesday", "Thursday", "Sunday"]}, gamers)
add_gamer({'name':'Michel Trujillo','availability': ["Monday", "Tuesday", "Wednesday"]}, gamers)


add_gamer({'name':'Thomas Nelson','availability': ["Tuesday", "Thursday", "Saturday"]}, gamers)
print(gamers)

#this last line (which ads Thomas Nelson) should return: "This name is already in the list"

  • 你的elif条件永远不会命中。 (这就是您没有收到错误的原因,否则列表的gamers["name"]会给出错误。
  • 即使您更正了if顺序,即使您将其设为 gamer['name'],您也会在list中插入一个dict ,然后检查str是否在列表中。

您可以定义 function 以通过给定的键值对在 dict 列表中搜索。


def search_list_of_dict(_list, _key, _value):
    return [el for el in _list if el.get(_key) == _value]

所以你的 function 定义变成了,

gamers = []

def add_gamer(gamer, gamers):
    if gamer.get("name") and gamer.get("availability"):
        if search_list_of_list(gamers, 'name', gamer.get("name"):
            print("This name already exists")
            return False
        else:
            gamers.append(gamer)
            return True
    else:
        print("Gamer missing critical information")
        return False

虽然,最重要的是,你真的应该使用dict ,因为在 list 中搜索是O(n)而在dict中搜索是O(1) ,你的代码也会大大简化。

此外,您不需要返回gamers ,因为您只是附加到它。 您可以返回一个 boolean 来指示插入是否成功。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM