我想知道我试图在python中实现的功能是否可行。
我有一个名为Creatures的全局哈希。生物包含称为哺乳动物,两栖动物,鸟类,昆虫的亚哈希。
哺乳动物有子哈希,称为鲸鱼,大象。两栖动物有子哈希,称为青蛙,幼虫。鸟类有亚哈希,叫鹰,长尾小鹦鹉。昆虫有子哈希,称为蜻蜓,蚊子。
再次,老鹰队有一些叫做男性,女性的子哈希。
我正在计算文本文件中所有这些生物的频率。例如,如果文件格式如下:
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级感到满意,即键 - >值。但在这里,有多个键和多个值。我不知道如何处理这个问题。我正在使用python 2.6。谢谢你的推荐!
答案 0 :(得分:20)
分配给字典中的键的值本身可以是另一个字典
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
对于任意级别的嵌套,您可以使用此递归定义
dd = defaultdict( lambda: dd )
creatures = dd()
creatures['birds']['eagle']['female'] = 0
在这种情况下,您需要显式初始化整数值,否则creatures['birds']['eagle']['female']
的值将被假定为另一个defaultdict
。
答案 1 :(得分: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})
如果您需要嵌套字典 - 仍然可以对该结果进行后处理......
答案 2 :(得分: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
不会起作用)