[英]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.