有没有可能有一个python字典的字典?

2024-10-03 23:23:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我想要一个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。你知道吗

知道我做错了什么吗?你知道吗


Tags: 文件代码intxtfor字典showline
3条回答

问题是,每次向字典中添加新的dict对时,都是为dOfDofD[show]dOfDofD[show][media]创建新的dict。要解决这个问题,可以使用^{}。这是一行: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])

show: Simpsons. media: tv. gender: male. character: Homer.

show: Simpsons. media: tv. gender: female. character: Marge.

show: Gone with the Wind. media: film. gender: male. character: Clark Gable.

show: Gone with the Wind. media: film. gender: female. character: Vivien Leigh.

show: Muppets. media: tv. gender: male. character: Kermit.

show: Muppets. media: tv. gender: female. character: Miss Piggy.

show: Anthony and Cleopatra. media: film. gender: male. character: Richard Burton.

show: Anthony and Cleopatra. media: film. gender: female. character: Elizabeth Taylor.

另外,我在你的程序里修改了一些东西。我把dOfDofD改名为dOfDOfD(适当的驼色大小写)。我使用了with...as语句来打开这些文件,这提供了许多优点(这里我不讨论它们,但如果您好奇,可以用Google搜索一下)。我用“%s”更改了您的字符串格式,以使用^{}方法(现在推荐的格式化字符串的方法)。你知道吗

是:可以创建嵌套字典。你知道吗

您一直在为文本文件中的每一行覆盖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]类似。你知道吗

或者你可以用^{}。你知道吗

看到您的输入文件是逗号分隔的:看一下python ^{} module。你知道吗

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()

相关问题 更多 >