求助:将CSV/元组转换为指定格式Dict的实现方法
没问题,这两个需求都很容易实现,我来一步步给你讲清楚~
处理CSV文件生成目标字典
你用csv.DictReader()的思路是对的,只是需要额外处理按ticket分组收集asset的逻辑。这里有两种实现方式:
方式1:用普通字典手动判断
这种方式不需要额外导入模块,适合基础场景:
import csv # 初始化空字典 ticket_assets = {} with open('your_file.csv', 'r') as csv_file: # 用DictReader读取,自动识别表头 reader = csv.DictReader(csv_file) for row in reader: ticket = row['ticket'] asset = row['asset'] # 如果ticket还没作为key存在,先创建空列表 if ticket not in ticket_assets: ticket_assets[ticket] = [] # 将当前asset添加到对应ticket的列表中 ticket_assets[ticket].append(asset) print(ticket_assets) # 输出: {'1111': ['3456', '6789'], '1122': ['2345', '7890']}
方式2:用collections.defaultdict简化代码
如果想让代码更简洁,可以用defaultdict自动处理空列表的初始化:
import csv from collections import defaultdict # 初始化一个默认值为列表的字典 ticket_assets = defaultdict(list) with open('your_file.csv', 'r') as csv_file: reader = csv.DictReader(csv_file) for row in reader: # 直接添加,无需判断key是否存在 ticket_assets[row['ticket']].append(row['asset']) # 可选:如果需要转换成普通字典(而非defaultdict类型) ticket_assets = dict(ticket_assets) print(ticket_assets)
处理元组生成目标字典
处理元组的逻辑和CSV基本一致,核心都是遍历+分组收集,同样有两种方式:
方式1:普通字典实现
data_tuple = ((1111, 3456), (1111, 6789), (1122, 2345), (1122, 7890)) ticket_assets = {} for ticket, asset in data_tuple: # 注意:你的目标字典key是字符串类型,所以这里转成str() ticket_str = str(ticket) asset_str = str(asset) if ticket_str not in ticket_assets: ticket_assets[ticket_str] = [] ticket_assets[ticket_str].append(asset_str) print(ticket_assets) # 输出: {'1111': ['3456', '6789'], '1122': ['2345', '7890']}
方式2:defaultdict简化
from collections import defaultdict data_tuple = ((1111, 3456), (1111, 6789), (1122, 2345), (1122, 7890)) ticket_assets = defaultdict(list) for ticket, asset in data_tuple: # 转成字符串匹配目标格式 ticket_assets[str(ticket)].append(str(asset)) # 转成普通字典(可选) ticket_assets = dict(ticket_assets) print(ticket_assets)
如果不需要把数字转成字符串,直接用原始整数作为key和value,去掉str()转换即可。
内容的提问来源于stack exchange,提问作者Karthik
相关产品推荐
相关产品推荐

