这里是我的回答的更新版本,其中叶树数据结构现在不同f从那里休息。取代树严格为嵌套-dict
-of-nested-dict
s,则每个分支上的“叶”现在是dict
的不同子类的实例,其名称为collections.Counter
,它们用于计算每个键的出现次数。我这样做是因为你对我的问题的回答,即如果每行的最后一部分不是":pass"
(这是“我们必须为该密钥重新计数”),会发生什么情况。
嵌套词典通常被称为Tree
数据结构,并且可以递归定义—根是一个字典作为是枝条。以下内容使用dict
子类而不是普通的dict
,因为它使构建起来更容易,因为您不需要特殊情况创建下一级的第一个分支(除了添加“离开”时我仍然这样做,因为它们是一个不同的子类,collections.Counter
)。
from collections import Counter
import re
# (optional) trick that redefines Counter subclass to print like a regular dict
class Counter(Counter):
def __repr__(self):
return dict(self).__repr__()
# borrowed from answer @ http://stackoverflow.com/a/19829714/355230
class Tree(dict):
def __missing__(self, key):
value = self[key] = type(self)()
return value
# some functions based on answer @ http://stackoverflow.com/a/14692747/355230
def nested_dict_get(nested_dict, keys):
return reduce(lambda d, k: d[k], keys, nested_dict)
def nested_dict_set(nested_dict, keys, value):
nested_dict_get(nested_dict, keys[:-1])[keys[-1]] = value
def nested_dict_update_count(nested_dict, keys):
if nested_dict_get(nested_dict, keys[:-1]): # update existing Counter
nested_dict_get(nested_dict, keys[:-1]).update([keys[-1]])
else: # create a new Counter
nested_dict_set(nested_dict, keys[:-1], Counter([keys[-1]]))
d = Tree()
pat = re.compile(r'[a-zA-z]+')
with open('abc.txt') as file:
for line in file:
nested_dict_update_count(d, [w for w in pat.findall(line.rstrip())])
print d # prints like a regular dict
要测试的修改后的代码叶计数能力,我用下面的测试文件,其中包括两次在同一行,一旦与:pass
再次结束和在另一:fail
结束。
扩展abc.txt
测试文件:
abc/pqr/lmn/xyz:pass
abc/pqr/lmn/bcd:pass
abc/pqr/lmn/xyz:fail
abc/pqr/lmn/xyz:pass
输出:
请让我知道,如果这是你对每行计算的最后一个字评论的正确解释。
对不起。我是python的新手,但是这个输出的解决方案是什么。 – sachin27 2014-12-19 08:50:28
是的。对不起。 – sachin27 2014-12-19 08:52:03
如果每行的最后一部分不是“:pass”,该怎么办? – martineau 2014-12-19 08:52:55