我想知道Twitter中的推文中出现一个单词的频率.我使用Twitter API从twitter下载了500条推文,并制作了一个字典,其中包含单词频率作为键,以及与该频率对应的所有单词列表作为值.
我一直以为字典总是无序的,所以我想以某种方式订购我的字典.但是当我看着它时,它已经被键从低到高排序.这怎么可能?
这是我使用的代码:
def countWords(cleanDict): reverseDict = {} FreqDict = {} count = 1 for tweet_id in cleanDict: tweet = cleanDict[tweet_id] wordList = tweet.split() for word in wordList: # Creates a dictionary with words as keys and # frequencies as values if word in reverseDict: reverseDict[word] += 1 else: reverseDict[word] = 1 for word in reverseDict: # Creates a dictionary with frequencies as keys and # lists of words as values if reverseDict[word] in FreqDict: temp = FreqDict[freqDict[word]] temp.append(word) FreqDict[freqDict[word]] = temp else: FreqDict[freqDict[word]] = [word] return FreqDict countWords(cleanDict) # cleanDict is a dictionary with tweet ID's as keys and # tweets as values
不要误会我的意思,我的字典已经按照这样的顺序排序了,但是怎么样?这是我添加到字典或其他东西的方式吗?
编辑
我试着用整数作为键和一些字符串作为值来制作字典.我没有按顺序添加密钥,但是当我打印这个字典时,它再次按键排序.这是python总能做到的吗?
"无序"是用词不当 - 它们是任意排序的,留给实施.具体来说,保证顺序是任意的,但是一致的(在python解释器的单个实例中[1]).
至于为什么你会得到这种行为 - 你使用int
s作为你的钥匙.碰巧在cPython中,hash
a int
本身就是这样.这样:
d = dict(zip(range(100),' '*100)) print(d)
由于实现细节,将始终以数字顺序出现密钥.但是这个:
d = dict((L, i) for i, L in enumerate('abcdefg')) print(d)
(很可能)不会按字母顺序打印出来.
[1]字符串散列行为可能因解释器实例而异,具体取决于您正在运行的python版本.Python 3为字符串键的散列引入了"随机种子"作为安全措施.您可以在python 2.7上启用该行为python -R
.