我有一个两级深度的字典。也就是说,第一个字典中的每个键都是一个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...
字典本身很长,里面有25个网址,每个网址都有另一个字典作为其值,网址中找到的每个单词及其找到的次数。
我想找到字典中最不同网址中出现的字词。所以输出应该是这样的:
以下字词在y页面上出现x次:单词列表
答案 0 :(得分:4)
您似乎应该使用Counter
:
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()
获取子区域的 all 中常见的单词:
subdicts = iter(dic.values())
s = set(next(subdicts)).intersection(*subdicts)
现在你可以使用该集来过滤生成的计数器,删除每个子句中没有出现的单词:
c = Counter((k,v) for k,v in c.items() if k in s)
print c.most_common()
答案 1 :(得分:0)
计数器不是你想要的。从您显示的输出中,您似乎想要跟踪出现的总次数以及出现该单词的页数。
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
这会产生以下输出:
word1 : 5 occurrences on 1 pages
word3 : 3 occurrences on 2 pages
word2 : 12 occurrences on 2 pages
这将捕获您想要的信息,下一步将是找到最常见的n
字。你可以使用一个heapsort来做到这一点(它有一个方便的功能,就是你不需要按照页数来排序整个单词列表然后出现 - 如果你总共有很多单词,这可能很重要,但是{{ 'top n'的1}}相对较小。)
n