字典中的嵌套列表:访问字典内列表的成员

0 投票
2 回答
613 浏览
提问于 2025-04-16 05:00
def index_dir(self, base_path):
    num_files_indexed = 0
    allfiles = os.listdir(base_path)
    self._documents = os.listdir(base_path)
    num_files_indexed = len(allfiles)
    docnumber = 0
    self._inverted_index = collections.defaultdict(list)
    docnumlist = []
    for file in allfiles: 
            self.documents = [base_path+file] #list of all text files
            f = open(base_path+file, 'r')
            lines = f.read()

            tokens = self.tokenize(lines)
            docnumber = docnumber + 1
            for term in tokens:  
            # check if the key/term already exists in the dictionary, 
            # if yes, just add a new key value/term into the dict
                if term not in sorted(self._inverted_index.keys()):
                    newlist=[]
                    tf=1
                    self._inverted_index[term] = []
                    #self._inverted_index[term][docnumber] +=1
                    newlist.append(docnumber)
                    newlist.append(tf)
                    self._inverted_index[term].append(newlist) #appending list to a list  
                else:
                        if docnumber not in self._inverted_index.get(term):
                            newlist=[]
                            tf=1
                            newlist.append(docnumber)
                            newlist.append(tf)
                            self._inverted_index[term].append(newlist) 
            f.close()
    print '\n \n'
    print 'Dictionary contents: \n'
    for term in sorted(self._inverted_index):
        print term, '->', self._inverted_index.get(term)
    return num_files_indexed
    return 0

从这段代码中我了解到:
字典的格式是这样的:
词汇 <- [[文档编号, 词频][文档编号, 词频]]
举个例子:如果“猫”这个词在1.txt文档中出现了三次,而在3.txt文档中出现了两次:
我得到的是:
猫 <- [[1,1],[1,1],[1,1],[3,1],[3,1]]
所以,我不想要[1,1]出现三次,而是想要[1,3]加到列表里。
我不知道怎么去掉列表中的重复项,并且增加词频。
我想要的结果是:
猫 <- [[1,3],[3,2]] 也就是说在1号文档中出现三次,在3号文档中出现两次。
我尝试了很多方法,但总是出现访问错误。

提前谢谢你。

2 个回答

0

最终的统计结果:

{'cat':[[1,3], [3,2]]}

当前文档中的单词:

{'cat':3}

我很喜欢你选择使用defaultdict。这样做可以实现以下功能,并且比逐个遍历键要快。

from collections import defaultdict
    all_word_counts = defaultdict(list)
    all_word_counts['cat'].append([1, 3])

首先统计给定文档中的单词频率

word_count = defaultdict(int) #reset each document
for term in self.tokenize(lines):
    word_count[term] += 1

在进入下一个文档之前,更新所有单词的统计数据

for word, count in word_count.iteritems():
    all_word_counts[word].append([docnumber, count])
0
>>> from itertools import groupby
>>> from operator import itemgetter
>>> cat = [[1,1],[1,1],[1,1],[3,1],[3,1]]
>>> [(k,len(list(v))) for k, v in groupby(cat,itemgetter(0))]
[(1, 3), (3, 2)]

这段代码会修复你的问题。但这并不能解决代码为什么一开始就出错的根本原因!解决办法是使用collections.Counter这个类,只要你给它一个单词列表,它就能帮你完成工作。

>>> words = "Lorem ipsum dolor sit ames, lorem ipsum dolor sit ames.".split(" ")
>>> Counter(words)
Counter({'ipsum': 2, 'sit': 2, 'dolor': 2, 'lorem': 1, 'ames.': 1, 'ames,': 1, 'Lorem': 1})
>>> Counter(map(str.lower, words))
Counter({'ipsum': 2, 'sit': 2, 'dolor': 2, 'lorem': 2, 'ames.': 1, 'ames,': 1})

撰写回答