如何在python的字典字典中查找最常用的条目
我有一本两层的字典。也就是说,第一个字典中的每个键都是url,值是另一个字典,每个键都是单词,每个值都是单词出现在该url上的次数。它看起来像这样:如何在python的字典字典中查找最常用的条目,python,data-structures,dictionary,Python,Data Structures,Dictionary,我有一本两层的字典。也就是说,第一个字典中的每个键都是url,值是另一个字典,每个键都是单词,每个值都是单词出现在该url上的次数。它看起来像这样: dic = { 'http://www.cs.rpi.edu/news/seminars.html': { 'hyper': 1, 'summer': 2, 'expert': 1, 'koushk': 1, 'semantic': 1, 'fe
dic = {
'http://www.cs.rpi.edu/news/seminars.html': {
'hyper': 1,
'summer': 2,
'expert': 1,
'koushk': 1,
'semantic': 1,
'feedback': 1,
'sandia': 1,
'lewis': 1,
'global': 1,
'yener': 1,
'laura': 1,
'troy': 1,
'session': 1,
'greenhouse': 1,
'human': 1
...and so on...
字典本身很长,有25个url,每个url都有另一个字典作为其值,其中包含url中找到的每个单词及其找到的次数
我想查找字典中最不同URL中出现的一个或多个单词。因此,输出应该如下所示:
dic = {
'http://www.cs.rpi.edu/news/seminars.html': {
'hyper': 1,
'summer': 2,
'expert': 1,
'koushk': 1,
'semantic': 1,
'feedback': 1,
'sandia': 1,
'lewis': 1,
'global': 1,
'yener': 1,
'laura': 1,
'troy': 1,
'session': 1,
'greenhouse': 1,
'human': 1
...and so on...
以下单词在y页上出现x次:单词列表
似乎您应该为此使用
计数器
:
from collections import Counter
print sum((Counter(x) for x in dic.values()),Counter()).most_common()
或多行版本:
c = Counter()
for d in dic.values():
c += Counter(d)
print c.most_common()
要获取在所有子部分中通用的单词,请执行以下操作:
subdicts = iter(dic.values())
s = set(next(subdicts)).intersection(*subdicts)
现在,您可以使用该集过滤生成的计数器,删除不出现在每个子CT中的单词:
c = Counter((k,v) for k,v in c.items() if k in s)
print c.most_common()
似乎您应该为此使用
计数器
:
from collections import Counter
print sum((Counter(x) for x in dic.values()),Counter()).most_common()
或多行版本:
c = Counter()
for d in dic.values():
c += Counter(d)
print c.most_common()
要获取在所有子部分中通用的单词,请执行以下操作:
subdicts = iter(dic.values())
s = set(next(subdicts)).intersection(*subdicts)
现在,您可以使用该集过滤生成的计数器,删除不出现在每个子CT中的单词:
c = Counter((k,v) for k,v in c.items() if k in s)
print c.most_common()
柜台不是你想要的。从您显示的输出来看,您似乎希望跟踪出现的总次数以及单词出现的页数
data = {
'page1': {
'word1': 5,
'word2': 10,
'word3': 2,
},
'page2': {
'word2': 2,
'word3': 1,
}
}
from collections import defaultdict
class Entry(object):
def __init__(self):
self.pages = 0
self.occurrences = 0
def __iadd__(self, occurrences):
self.pages += 1
self.occurrences += occurrences
return self
def __str__(self):
return '{} occurrences on {} pages'.format(self.occurrences, self.pages)
def __repr__(self):
return '<Entry {} occurrences, {} pages>'.format(self.occurrences, self.pages)
counts = defaultdict(Entry)
for page_words in data.itervalues():
for word, count in page_words.iteritems():
counts[word] += count
for word, entry in counts.iteritems():
print word, ':', entry
这将捕获您想要的信息,下一步将是查找最常见的n
单词。您可以使用heapsort(它的便利功能是不要求您按出现的页数对整个单词列表进行排序-如果您总共有很多单词,这可能很重要,但是“top n”的n
相对较小)
柜台不是你想要的。从您显示的输出来看,您似乎希望跟踪出现的总次数以及单词出现的页数
data = {
'page1': {
'word1': 5,
'word2': 10,
'word3': 2,
},
'page2': {
'word2': 2,
'word3': 1,
}
}
from collections import defaultdict
class Entry(object):
def __init__(self):
self.pages = 0
self.occurrences = 0
def __iadd__(self, occurrences):
self.pages += 1
self.occurrences += occurrences
return self
def __str__(self):
return '{} occurrences on {} pages'.format(self.occurrences, self.pages)
def __repr__(self):
return '<Entry {} occurrences, {} pages>'.format(self.occurrences, self.pages)
counts = defaultdict(Entry)
for page_words in data.itervalues():
for word, count in page_words.iteritems():
counts[word] += count
for word, entry in counts.iteritems():
print word, ':', entry
这将捕获您想要的信息,下一步将是查找最常见的n
单词。您可以使用heapsort(它的便利功能是不要求您按出现的页数对整个单词列表进行排序-如果您总共有很多单词,这可能很重要,但是“top n”的n
相对较小)
你能提供一个完整的输入和输出示例吗?还有,你到目前为止尝试了什么?你能提供一个完整的输入和输出示例吗?还有,你到目前为止尝试了什么?
从集合导入计数器同样的原因,你不能使用dict
s和list
s作为dict
键:可变性。你得到了一个类型错误:不可损坏的类型:“dict”
,是吗?哦,我可能误解了你的疑惑,请大声提问!)啊,这是因为实现没有检查other
是否实际具有该键,而是执行self[key]+other[key]
。尽管如此,他们似乎应该能够放松断言,计数器
只能添加到其他计数器
@Kimvais——我想知道为什么不能执行计数器((1,1,2,3))+{1:3}
来自集合导入计数器
同样的原因,您不能将dict
s和list
s用作dict
键:可变性。你得到了一个类型错误:不可损坏的类型:“dict”
,是吗?哦,我可能误解了你的疑惑,请大声提问!)啊,这是因为实现没有检查other
是否实际具有该键,而是执行self[key]+other[key]
。尽管如此,他们似乎应该能够放松这样的断言:计数器
只能添加到其他计数器
@Kimvais——我想知道为什么你不能做计数器((1,1,2,3))+{1:3}