You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python字典多键存储异常:如何关联赛事信息与完整得分列表

问题:循环中无法正确提取带赛事、日期的完整得分列表

循环提取数据时,仅能获取单个最后数值而非完整列表:

  • 使用HockeyMatch[row[0]].append(row[3])时,可正确得到赛事对应得分列表(例如Chicago-Minnesota: [4, 2, 0, 3],其中row[0]为赛事名称,row[3]为芝加哥队过往比赛得分),但缺少赛事名称(row[1])和日期(row[2])信息。
  • 尝试HockeyMatch[row[0],row[1],row[2]].append(row[3])时,仅得到最后一个得分值[4],无法生成完整列表。

期望得到的格式:

{('Chicago-Minnesota', 'NHL', '12/27/2022'): [4, 2, 0, 3]}

原代码

HockeyMatch = {}

conn_test = sqlite3.connect('database.db')
cursor_test = conn_test.cursor()
my = cursor_test.execute('''SELECT Next.ClubHome||"-"||Next.ClubAway, Next.Tournament, Next.Date, MatchResults.ScoreHome
                                    FROM Next
                                    INNER JOIN MatchResults 
                                    ON Next.ClubHome = MatchResults.ClubHome;''') 

for row in my.fetchall():
    if row[0] not in HockeyMatch:

        HockeyMatch[ row[0],row[1],row[2] ] = []
    HockeyMatch[ row[0],row[1],row[2] ].append(row[3])
    print(HockeyMatch)

示例数据库

NEXT表

ClubHomeClubAwayTournamentDate
ChicagoMinnesotaNHL27.12
ArizonaLos AngelesNHL27.12
DallasVegas GoldNHL27.12

MATCHRESULTS表(仅关注芝加哥队得分)

ClubHomeClubAwayTournamentDateScoreHomeScoreAway
ChicagoTorontoNHL27.1212
New YorkVegas GoldNHL27.1223
DallasMinnesotaNHL27.1201
ChicagoBuffalo SabNHL27.1220

解决方案

问题出在判断逻辑:你用if row[0] not in HockeyMatch检查键是否存在,但字典的实际键是三元组(row[0], row[1], row[2]),不是单独的row[0]。这导致每次循环都新建键值对,覆盖之前的列表,最终只保留最后一个得分。

修改后的代码

HockeyMatch = {}

conn_test = sqlite3.connect('database.db')
cursor_test = conn_test.cursor()
my = cursor_test.execute('''SELECT Next.ClubHome||"-"||Next.ClubAway, Next.Tournament, Next.Date, MatchResults.ScoreHome
                                    FROM Next
                                    INNER JOIN MatchResults 
                                    ON Next.ClubHome = MatchResults.ClubHome;''') 

for row in my.fetchall():
    # 用完整三元组作为键做存在性检查
    key = (row[0], row[1], row[2])
    if key not in HockeyMatch:
        HockeyMatch[key] = []
    HockeyMatch[key].append(row[3])
print(HockeyMatch)

逻辑说明

  • 原代码中,row[0]永远不会作为键存在于字典中(字典键是三元组),因此每次循环都会新建空列表,最后仅追加当前循环的得分,导致列表只有一个元素。
  • 修改后,用完整三元组作为键检查,仅当该组合不存在时才创建空列表,后续循环直接往已有列表追加得分,最终得到完整的得分列表。

内容的提问来源于stack exchange,提问作者user20812299

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 13:20:19