写入每个循环周期的特定字典列表

Write to specific dictionary list for each cycle of loop

提问人:K D 提问时间:10/16/2023 最后编辑:K D 更新时间:10/16/2023 访问量:69

问:

第一,我对 Python 非常陌生,所以请不要把我的头从:)上移开我一整天都在阅读并尝试让它发挥作用,但我就是想不通。

我有一个列表:它是通过体育网站上网页的抓取选项卡创建的(列表全天变化),其中包含 ex。allLeagues = []

['NFL', 'NFL1Q', 'MLB', 'SOCCER', 'MLBLIVE', 'NFL1H', 'LoL', 'NBASZN', 'CSGO', 'KBO', 'CS2', 'TENNIS', 'MMA', 'CRICKET']

然后,我循环浏览每个联赛/标签并获取我需要的一切:

AllPlayers = []
for league in leagues:
    driver.find_element(By.XPATH, f"//div[@class='name'][normalize-space()='{league}']").click()
    time.sleep(2)
    # Wait for the stat-container element to be present and visible
    stat_container = WebDriverWait(driver, 10.until(EC.visibility_of_element_located((By.CLASS_NAME, "stat-container")))
    # Find all stat elements within the stat-container
    # i.e. categories is the list ['Points','Rebounds',...,'Turnovers']
    categories = driver.find_element(By.CSS_SELECTOR, ".stat-container").text.split('\n')
    # Iterate over each stat element
    for category in categories:
        # Click the stat element
        line = '-'*len(category)
        print(line + '\n' + category + '\n' + line)
        driver.find_element(By.XPATH, f"//div[text()='{category}']").click()

        projections = WebDriverWait(driver, .until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, ".projection")))

        for projection in projections:

            names = projection.find_element(By.XPATH, './/div[@class="name"]').text
            points= projection.find_element(By.XPATH, './/div[@class="presale-score"]').get_attribute('innerHTML')
            text = projection.find_element(By.XPATH, './/div[@class="text"]').text.replace('\n','')
            print(names, points, text)

            players = {'Name': names, 'Prop':points, 'Line':text}
            AllPlayers.append(players)

它循环浏览每个联赛/标签并抓住我需要的一切。

我现在感到困惑的地方是,我想将循环的每个周期附加到单独的列表中。我可以把它们都放到一个列表中,但我希望每个不同联赛的数据都在它自己的列表中。例如,从 NFL 选项卡抓取数据时,在字典中追加到 NFL[]。

我一直在阅读的所有内容都说要创建一本词典,所以我尝试:

list_dict = {}
for league in allLeagues:
    list_dict[league] = []
    print(list_dict)

返回以下内容: 字典打印(尝试发布代码,但 SO 说我的帖子看起来像垃圾邮件,而且由于我是新手,所以还不能在这里上传图片) 不太确定我在那里做错了什么,但我假设我所需要的只是该字典的最后一行:

{'NFL': [], 'NFL1Q': [], 'MLB': [], 'SOCCER': [], 'MLBLIVE': [], 'NFL1H': [], 'LoL': [], 'NBASZN': [], 'CSGO': [], 'KBO': [], 'CS2': [], 'TENNIS': [], 'MMA': [], 'CRICKET': []}

所以这就是我所处的位置。试图理解我从列表中创建字典的错误。并将循环中抓取的数据附加到每个单独的字典条目/列表中。

任何帮助都非常感谢!谢谢!

Python 列表 循环 字典

评论

1赞 Ignatius Reilly 10/16/2023
看一看 defaultdict
1赞 rioV8 10/16/2023
AllPlayers = { league:[] for league in allLeagues}
1赞 rioV8 10/16/2023
AllPlayers[league].append(players)
0赞 rioV8 10/16/2023
如果您不使用现在使用的代码或 2 个循环的简化版本编辑/更新您的问题,我只能猜测for
0赞 K D 10/16/2023
感谢您的信息 IgnatiusReilly 和 Perfect @rioV8,感谢!

答:

0赞 JonasV 10/16/2023 #1

你可以这样做:

leagues = { league: [] for league in allLeagues}

for league, players in leagues.items():
    ...
    for category in categories:
        ....
            players = {'Name': names, 'Prop':points, 'Line':text}
            players.append(players)

leagues.items()将取出字典的键和值。因此,它将返回联赛的名称和属于该联赛的(在开始时)空列表,我们在 for 循环中将其称为球员。

最后,你只需将你抓取的球员附加到该列表中即可。

这里需要注意的一个概念是不变性与可变性。基本上 python 列表是可变的,所以你可以在 for 循环中取出对列表的引用,用 append 向它添加元素,即使你没有将完整的列表写回字典,这些更改也会反映在字典中。

例如,有关该概念的更多详细信息,请参阅此处,它在 Python 中非常重要,并且通常会导致问题/误解。