我想在python中使用三维哈希 - 一本字典字典的字典。我不知道这是否可能,而且我遇到了一些我不明白的问题让我怀疑这是不可能的。下面是一段示例代码,其中包含两个逗号分隔文件(' tv.txt'和#39; film.txt')并将数据放在字典字典(dOfDofD)字典中。这两个文件看起来像这样:
tv.txt
Muppets,female,Miss Piggy
Muppets,male,Kermit
Simpsons,female,Marge
Simpsons,male,Homer
film.txt
Gone with the Wind,female,Vivien Leigh
Gone with the Wind,male,Clark Gable
Anthony and Cleopatra,female,Elizabeth Taylor
Anthony and Cleopatra,male,Richard Burton
我的代码读取这两个文件并创建dOfDofD,但是当涉及到检索数据时,似乎有一些系统方式缺失:只有最后一级字典的最后一个例子似乎存在。代码是:
#!/usr/bin/env python
import string
dOfDofD = {}
mediaList = ['tv', 'film']
showSet = set()
for media in mediaList:
fName = media + ".txt"
f = open(fName, 'r')
for line in f:
line = line.rstrip('\n')
dataList = string.splitfields(line, ',')
show = dataList[0]
showSet.add(show)
gender = dataList[1]
name = dataList[2]
dOfDofD[show] = {}
dOfDofD[show][media] = {}
dOfDofD[show][media][gender] = name
f.close()
for show in showSet:
for media in dOfDofD[show]:
for gender in dOfDofD[show][media]:
print "show: %s. media: %s. gender: %s. character: %s." % \
(show, media, gender, dOfDofD[show][media][gender])
这只打印出男性角色,好像是女性角色已被覆盖(首先设置)。
show: Simpsons. media: tv. gender: male. character: Homer.
show: Gone with the Wind. media: film. gender: male. character: Clark Gable.
show: Muppets. media: tv. gender: male. character: Kermit.
show: Anthony and Cleopatra. media: film. gender: male. character: Richard Burton.
我在Ubuntu 14.04上运行python 2.7.6。
任何想法我做错了什么?
答案 0 :(得分:1)
是的:可以创建嵌套字典。
你会为文本文件中的每一行覆盖dOfDofD[show]
。
if show in dOfDofD:
show_dict = dOfDofD[show]
else:
show_dict = {}
dOfDofD[show] = show_dict
# do something with show_dict
和dOfDofD[show][media]
的类似内容。
或者您可以使用defaultdict
。
并看到您的输入文件以逗号分隔:请查看python csv
module。
答案 1 :(得分:0)
根据hiro protagonist的帖子,这里是我使用的代码片段:
for media in mediaList:
fName = media + ".txt"
f = open(fName, 'r')
for line in f:
line = line.rstrip('\n')
dataList = string.splitfields(line, ',')
show = dataList[0]
showSet.add(show)
gender = dataList[1]
name = dataList[2]
if show in dOfDofD:
if media in dOfDofD[show]:
dOfDofD[show][media][gender] = name
else:
dOfDofD[show][media] = {}
dOfDofD[show][media][gender] = name
else:
dOfDofD[show] = {}
dOfDofD[show][media] = {}
dOfDofD[show][media][gender] = name
f.close()
答案 2 :(得分:0)
问题在于,每次向字典添加新配对时,都会为dOfDofD[show]
和dOfDofD[show][media]
创建新的配方。要解决此问题,您可以使用dict.setdefault()
。这是一行:dOfDOfD.setdefault(show, {}).setdefault(media, {})[gender] = name
。
dOfDOfD = {}
mediaList = ['tv', 'film']
showSet = set()
for media in mediaList:
with open('{}.txt'.format(media), 'r') as f:
for line in f:
show, gender, name = line.split(',')
showSet.add(show)
dOfDOfD.setdefault(show, {}).setdefault(media, {})[gender] = name
for show in showSet:
for media in dOfDOfD[show]:
for gender in dOfDOfD[show][media]:
print "show: {}. media: {}. gender: {}. character: {}.".format(
show, media, gender, dOfDOfD[show][media][gender])
显示:辛普森一家。媒体:电视。性别:男性。性格:荷马。
显示:辛普森一家。媒体:电视。性别女。性格:Marge。
显示:随风而去。媒体:电影。性别:男性。性格:克拉克盖博。
显示:随风而去。媒体:电影。性别女。性格:费雯丽。
显示:布偶。媒体:电视。性别:男性。字符:Kermit。
显示:布偶。媒体:电视。性别女。性格:小猪小姐。
节目:安东尼和克利奥帕特拉。媒体:电影。性别:男性。性格:理查德伯顿。
节目:安东尼和克利奥帕特拉。媒体:电影。性别女。性格:伊丽莎白泰勒。
另外,我改变了你程序中的其他一些东西。我将dOfDofD
重命名为dOfDOfD
(适当的骆驼套管)。我使用了with...as
语句来打开文件,这提供了许多优点(我不会在这里讨论它们,但如果你只是谷歌那么好奇)。我用'%s'更改了字符串格式以使用str.format()
方法(现在推荐的格式化字符串的方法)。