如何在python的字典字典中查找最常用的条目

如何在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

我有一本两层的字典。也就是说,第一个字典中的每个键都是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个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}