添加city作为主键触发ValueError,求代码修正及输出调整方案
问题描述
原本以name为主键时代码运行正常,输出格式如Jonny 33、Tiffany 45等。现在希望添加city作为主键,输出格式改为Liverpool, Jonny 33.,但运行代码时触发错误:ValueError: not enough values to unpack (expected 3, got 2),怀疑字典创建或city的添加方式有误,请求修正代码并实现city前置的输出要求。
原代码如下:
import sqlite3 c = sqlite3.connect('abc') cursor = c.cursor() x = {} def Button_func(): data = c.execute('SELECT city, name1, name2, number FROM MyListTable') for r in data.fetchall(): if r[0] not in x: x[r[0]] = [] x[r[0]].append([r[1], r[3]]) for key_city, val_name, val_number in x.items(): result = sum(val_number) / 2 print(key_city, val_name, result) Button_func()
错误原因
报错出现在字典遍历的循环中:for key_city, val_name, val_number in x.items()。x.items()返回的是键值对元组(每个元组包含2个元素:城市名、对应的[name, number]列表集合),但你试图将其拆分为3个变量,这就导致了“值不足”的错误。此外,后续对val_number执行sum()也会出错,因为val_number实际上是单个数值而非可迭代的列表。
修正后的代码
import sqlite3 def Button_func(): # 用with语句自动管理数据库连接,避免手动关闭的遗漏 with sqlite3.connect('abc') as c: data = c.execute('SELECT city, name1, name2, number FROM MyListTable') city_data = {} for row in data.fetchall(): city = row[0] name = row[1] # 若需要合并name1和name2,可改为f"{row[1]} {row[2]}" number = row[3] # 按城市分组存储name和number的对应关系 if city not in city_data: city_data[city] = [] city_data[city].append((name, number)) # 按要求格式输出内容 for city, name_num_pairs in city_data.items(): for name, num in name_num_pairs: # 若保留原代码的sum/2逻辑,可根据实际需求调整,比如改为result = num / 2 print(f"{city}, {name} {num}.") Button_func()
关键修改点
- 修复遍历逻辑:调整字典遍历方式,先取城市名和对应的
(name, number)集合,再嵌套遍历每个name和number,匹配字典的实际结构。 - 优化变量作用域:将存储数据的字典移至函数内部,避免全局变量带来的潜在问题。
- 规范输出格式:使用f-string实现
城市, 名字 数值.的要求格式。 - 数据库连接优化:使用
with语句自动管理数据库连接,无需手动处理关闭操作。
内容的提问来源于stack exchange,提问作者user20737376
相关产品推荐
相关产品推荐

