10

我想知道我尝试在 python 中实现的功能是否可行。

我有一个名为 Creatures 的全局哈希。生物包含称为哺乳动物、两栖动物、鸟类、昆虫的子哈希。

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

再次,Eagles 有称为男性、女性的子哈希。

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

Birds   Eagle  Female
Mammals whales Male
Birds   Eagle  Female

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

在 Python 中可能吗?怎么做到呢?我对 Python 很陌生,非常感谢您的帮助。我对只有 1 级的字典感到满意,即 key-> value。但是在这里,有多个键和多个值。我不知道如何进行。我正在使用python 2.6。提前感谢!

4

3 回答 3

29

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

creatures = dict()
creatures['birds'] = dict()
creatures['birds']['eagle'] = dict()
creatures['birds']['eagle']['female'] = 0
creatures['birds']['eagle']['female'] += 1

但是,您需要显式创建每个字典。与 Perl 不同,当您尝试将未分配键的值视为此类时,Python 不会自动创建字典。

当然,除非您使用 a defaultdict

from collections import defaultdict
creatures = defaultdict( lambda: defaultdict(lambda: defaultdict( int )))
creatures['birds']['eagle']['female'] += 1

对于任意级别的嵌套,您可以使用此递归定义

dd = defaultdict( lambda: dd )
creatures = dd
creatures['birds']['eagle']['female'] = 0

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

>>> creatures = dd
>>> type(creatures['birds']['eagle']['female'])
<class 'collections.defaultdict'>
于 2013-06-17T18:40:59.563 回答
2

如果您只需要“计算”事物 - 并假设数据文件包含所有必需的“哈希”级别 - 那就可以了:

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(<type 'int'>, {'Mammals-whales-Male': 1, 'Birds-Eagle-Female': 2})

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

于 2013-06-17T18:46:01.347 回答
1

不优雅,但工作:

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 Female并且Birds Eagle不会工作)

于 2013-06-17T18:55:43.350 回答