Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python中的多级键和值_Python_Python 2.7_Dictionary - Fatal编程技术网

Python中的多级键和值

Python中的多级键和值,python,python-2.7,dictionary,Python,Python 2.7,Dictionary,我想知道我试图用python实现的功能是否可行 我有一个叫做“生物”的全局哈希。生物包含称为哺乳动物、两栖动物、鸟类和昆虫的子散列 哺乳动物有称为鲸鱼、大象的子散列。两栖动物有一种称为青蛙、幼虫的亚群。鸟类有一种称为鹰、长尾鹦鹉的亚哈希。昆虫的子散列称为蜻蜓,蚊子 同样,老鹰有一个子散列,称为雄性,雌性 我正在从一个文本文件中计算所有这些生物的频率。例如,如果文件的格式如下: Birds Eagle Female Mammals whales Male Birds Eagle Fem

我想知道我试图用python实现的功能是否可行

我有一个叫做“生物”的全局哈希。生物包含称为哺乳动物、两栖动物、鸟类和昆虫的子散列

哺乳动物有称为鲸鱼、大象的子散列。两栖动物有一种称为青蛙、幼虫的亚群。鸟类有一种称为鹰、长尾鹦鹉的亚哈希。昆虫的子散列称为蜻蜓,蚊子

同样,老鹰有一个子散列,称为雄性,雌性

我正在从一个文本文件中计算所有这些生物的频率。例如,如果文件的格式如下:

Birds   Eagle  Female
Mammals whales Male
Birds   Eagle  Female

I should output Creatures[Birds[Eagle[Female]]] = 2
                Creatures[mammals[Whales[Male]]] = 1  

在Python中可能吗?怎样才能做到呢?我是Python新手,非常感谢您的帮助。我对字典只有一个级别感到满意,即key->value。但这里有多个键和多个值。我不知道如何进行这项工作。我正在使用python 2.6。谢谢你

分配给字典中某个键的值本身可以是另一个字典

creatures = dict()
creatures['birds'] = dict()
creatures['birds']['eagle'] = dict()
creatures['birds']['eagle']['female'] = 0
creatures['birds']['eagle']['female'] += 1
不过,您需要显式地创建每个字典。与Perl不同,当您尝试将未分配键的值作为字典处理时,Python不会自动创建字典

当然,除非您使用
defaultdict

from collections import defaultdict
creatures = defaultdict( lambda: defaultdict(lambda: defaultdict( int )))
creatures['birds']['eagle']['female'] += 1
>>> creatures = dd
>>> type(creatures['birds']['eagle']['female'])
<class 'collections.defaultdict'>
对于任意级别的嵌套,可以使用此递归定义

dd = defaultdict( lambda: dd )
creatures = dd
creatures['birds']['eagle']['female'] = 0
在这种情况下,您确实需要显式初始化整数值,否则,
生物['birds']['eagle']['female']
的值将被假定为另一个
defaultdict

from collections import defaultdict
creatures = defaultdict( lambda: defaultdict(lambda: defaultdict( int )))
creatures['birds']['eagle']['female'] += 1
>>> creatures = dd
>>> type(creatures['birds']['eagle']['female'])
<class 'collections.defaultdict'>
>>生物=dd
>>>类型(生物['birds']['eagle']['female'])
如果您只需要“计算”事情,并且假设数据文件包含所有必需级别的“散列”,那么就可以做到这一点:

import collections

result = collections.defaultdict(int)

with open("beast","rt") as f:
    for line in f:
        hashes = line.split()
        key = '-'.join(hashes)
        result[key] += 1

print result
生成结果:
defaultdict(,{'Mailures-Whates-Male':1,'Birds-Eagle-Male':2})


如果您需要嵌套字典--仍然可以对该结果进行后处理…

不优雅,但可以工作:

result = {}
for line in input_file.split("\n"):
    curdict = result
    values = line.split(" ")
    for item in values[:-1]:
        if item not in curdict:
            curdict[item] = {}
        curdict = curdict[item]
    last_item = values[-1]
    if last_item not in curdict:
        curdict[last_item] = 0
    curdict[last_item] += 1

这可能可以用更简洁的方式编写,但至少它可以工作并允许任意嵌套级别,除非您对同一“实体”有不同的嵌套级别(例如,
Birds-Eagle-femal
Birds-Eagle
不起作用)

它应该允许任意嵌套级别吗?您只需“计数”或者你希望对你的数据进行更多的处理?@J0HN是的,西尔万:计数将是一个好的开始,稍后我可以尝试进行更多的处理。鸟类、动物等等。。这些只是示例,而不是实际条目。实际上,我需要从文件中读取并自动添加它们