簡體   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