是否有可能在python中拥有字典词典的字典?

时间:2015-10-27 10:57:16

标签: python dictionary

我想在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。

任何想法我做错了什么?

3 个答案:

答案 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()方法(现在推荐的格式化字符串的方法)。