我想要一个python中的三维散列-一本字典的一本字典的一本字典的一本字典。我不知道这是否可能,我有一些问题我不明白,使我怀疑这是不可能的。下面的代码示例读取两个逗号分隔的文件('电视.txt'和'胶片.txt,并将数据放在dictionary of dictionary(dOfDofD)上。这两个文件如下所示:
电视.txt
Muppets,female,Miss Piggy
Muppets,male,Kermit
Simpsons,female,Marge
Simpsons,male,Homer
胶片.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.
我在ubuntu14.04上运行python2.7.6。你知道吗
知道我做错了什么吗?你知道吗
问题是,每次向字典中添加新的dict对时,都是为} 。这是一行:
dOfDofD[show]
和dOfDofD[show][media]
创建新的dict。要解决这个问题,可以使用^{dOfDOfD.setdefault(show, {}).setdefault(media, {})[gender] = name
。你知道吗另外,我在你的程序里修改了一些东西。我把} 方法(现在推荐的格式化字符串的方法)。你知道吗
dOfDofD
改名为dOfDOfD
(适当的驼色大小写)。我使用了with...as
语句来打开这些文件,这提供了许多优点(这里我不讨论它们,但如果您好奇,可以用Google搜索一下)。我用“%s”更改了您的字符串格式,以使用^{是:可以创建嵌套字典。你知道吗
您一直在为文本文件中的每一行覆盖
dOfDofD[show]
。你知道吗你可以试试这个:
和
dOfDofD[show][media]
类似。你知道吗或者你可以用^{} 。你知道吗
看到您的输入文件是逗号分隔的:看一下python ^{} module 。你知道吗
在hiro protagonist的帖子之后,我使用了以下代码:
相关问题 更多 >
编程相关推荐