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

时间:2010-10-05 07:23:25

标签: python

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

我从这段代码得到的结果:
这种格式的字典:
term< - [[docnumber,term freq] [docnumber,term freq]]
例如:如果单词cat出现在doc 1.txt中三次,而Doc 3.txt出现两次:
我明白了:
cat< - [[1,1],[1,1],[1,1],[3,1] [3,1]] 因此,我希望将[1,3]添加到列表中而不是[1,1]三次 我不知道如何摆脱列表中重复的成员并增加术语freq。
我应该得到什么:
cat< - [[1,3],[3,2]],即Doc 1中三次,doc 3中两次。
我已经尝试了解决方法,但是我一直都会遇到访问错误。

提前致谢。

2 个答案:

答案 0 :(得分: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})

答案 1 :(得分: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

在继续下一个文档之前,请更新all_word_counts

for word, count in word_count.iteritems():
    all_word_counts[word].append([docnumber, count])