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