Python循环中字典赋值疑问:为何直接赋值仅保留最后键值对?
字典赋值导致数据丢失的问题解答
问题描述
我在做UFC运动员数据爬取的小项目时遇到了一个困惑:
- 使用
id[x] = href['href']时,能正常将所有运动员的编号与对应链接存入字典,输入选择的编号可以输出对应链接 - 但换成
id = {x : href['href']}时,字典里只会保留最后一个键值对,无法获取之前的运动员链接
可运行代码如下:
import requests from bs4 import BeautifulSoup input2 = str(input('type the name of the athlete: ')) payload = {'gender':'All', 'search':input2} session = requests.Session() p = session.get('https://www.ufc.com/athletes/all?', params=payload) soup2 = BeautifulSoup(p.text, 'html.parser') spesific_athlete = soup2.find_all('div','c-listing-athlete-flipcard__inner') id = {} for x, a in enumerate(spesific_athlete, 1): spesific_athlet = a.find('span','c-listing-athlete__name') href = a.find('a', 'e-button--black') #{key : value} id[x] = href['href'] print(spesific_athlet.text, ': ', href['href'], '\n', x) choose = int(input('Which athlete do you choose(type a number): ')) print(id[choose])
原因分析
两种写法的核心差异在于是否保留字典原有数据:
id[x] = href['href']:这是对已初始化的字典id进行键值对的添加或更新操作。每次循环都会把当前的编号x和对应链接存入字典,之前的键值对会被完整保留,最终字典包含所有循环生成的内容。id = {x : href['href']}:这是每次循环都重新创建一个新字典,直接覆盖掉之前的id变量。循环结束后,字典里自然只存在最后一次循环生成的那一个键值对。
可选修复方案
如果想通过直接构建字典的方式实现需求,可以使用字典推导式一次性生成完整字典,避免循环内反复覆盖的问题:
# 替换原循环内的赋值代码 id = {x: a.find('a', 'e-button--black')['href'] for x, a in enumerate(spesific_athlete, 1)}
这种写法会遍历所有运动员数据,一次性生成包含所有编号与对应链接的字典,效果和原代码一致。
内容的提问来源于stack exchange,提问作者Alp Eren Gül
相关产品推荐
相关产品推荐

