我有一个具有以下结构的csv文件:
team,tournament,player
Team 1,spring tournament,Rebbecca Cardone
Team 1,spring tournament,Salina Youngblood
Team 1,spring tournament,Catarina Corbell
Team 1,summer tournament,Cara Mejias
Team 1,summer tournament,Catarina Corbell
...
Team 10, spring tournament,Jessi Ravelo
我想创建一个嵌套字典(团队、锦标赛),其中包含玩家字典列表。期望的结果是:
{'data':
{Team 1:
{'spring tournament':
{'players': [
{name: Rebecca Cardone},
{name: Salina Youngblood},
{name: Catarina Corbell}]
},
{'summer tournament':
{'players': [
{name: Cara Mejias},
{name: Catarina Corbell}]
}
}
},
...
{Team 10:
{'spring tournament':
{'players': [
{name: Jessi Ravelo}]
}
}
}
}
我一直在努力把它格式化成这样。我已经能够成功地嵌套第一级(团队-->;锦标赛),但我无法嵌套第二级。目前,我的代码如下所示:
d = {}
header = True
with open("input.csv") as f:
for line in f.readlines():
if header:
header = False
continue
team, tournament, player = line.strip().split(",")
d_team = d.get(team,{})
d_tournament = d_team.get(tournament, {})
d_player = d_tournament.get('player',['name'])
d_player.append(player)
d_tournament['player'] = d_tournament
d_team[tournament] = d_tournament
d[team] = d_team
print(d)
修复代码以便创建嵌套字典的下一步是什么
您描述的示例字典是不可能的(如果您希望在键“Team 1”下有多个字典,请将它们放在列表中),但此代码段:
对于本例
yourfile.csv
:提供以下信息:
您的实现中存在一些问题:
d_player = d_tournament.get('player',['name'])
。但实际上,您希望获得名为players的键,这应该是一个字典列表。这些词典的格式必须为{"name": "Player's Name"}
。所以你想要l_player = d_tournament.get('players',[])
(默认为空列表),然后执行l_player.append({"name": player})
(我将其重命名为l_player
,因为它是一个列表,而不是dict)李>d_tournament['player'] = d_tournament
。我猜你的意思是d_tournament['player'] = d_player
team, tournament, player = (word.strip() for word in line.split(","))
在进行这些更改后,代码可以正常工作
我强烈建议您使用
csv.reader
类来读取CSV文件,而不是手动用逗号分隔行此外,由于python的容器(列表和字典)包含对其内容的引用,您只需添加容器一次,然后使用
mydict["key"] = value
或mylist.append()
对其进行修改,这些更改也将反映在父容器中。由于这种行为,您不需要像使用d_team[tournament] = d_tournament
一样在循环中重复分配这些内容这给了我们想要的(美化输出):
也许我忽略了什么,但你不能用:
相关问题 更多 >
编程相关推荐