在Python中按频率值对列表进行排序

9

我是一个新手,对于Python和编程还不太容易理解。因为我开始阅读的书非常枯燥,所以我开始尝试一些想法。

这是我想做的事情: 打开文本文件,计算每个值(只是系统名称列表)的频率,按频率排序,并返回结果。 在搜索网络上的一些代码后,我得到了以下代码:

file = open('C:\\Temp\\Test2.txt', 'r')
text = file.read()
file.close()


word_list = text.lower().split(None)

word_freq = {}

for word in word_list:

    word_freq[word] = word_freq.get(word, 0) + 1
list = sorted(word_freq.keys())
for word in list:
    print ("%-10s %d" % (word, word_freq[word]))

这个功能可以正常工作,但是它是通过列表中的单词/系统名称进行排序的:

pc05010    3
pc05012    1
pc05013    8
pc05014    2

我希望您能够将其变成这样:

pc05013    8
pc05010    3
pc05014    2
pc05012    1

现在我已经花了好几个小时在寻找按值排序的函数上。我敢打赌它一定很简单,但是我找不到。

以我的初学者角度来看,这可能与以下代码有关:

list = sorted(word_freq.keys())

我认为可能是这样的:
list = sorted(word_freq.values())

但是对我来说,看到关于这种语言的大量信息,却无法使这些简单的事情正常工作,这让我非常沮丧。请帮忙一下:) 非常感谢!

2
你不应该使用 list 作为变量名,因为它是内置的 list() 函数的名称。这样做被称为 shadowing builtins - Burhan Khalid
3个回答

5

在这里你需要使用word_freq.items()

lis = sorted(word_freq.items(), key = lambda x:x[1], reverse = True)
for word,freq in lis:
    print ("%-10s %d" % (word, freq))

不要使用list作为变量名。


4

看一下collections.Counter

>>> wordlist = ['foo', 'bar', 'foo', 'baz']
>>> import collections
>>> counter = collections.Counter(wordlist)
>>> counter.most_common()
[('foo', 2), ('baz', 1), ('bar', 1)]

4

使用collections.Counter可以帮助计数,with语句可以帮助打开(和关闭)文件。

import collections

with open('C:\\Temp\\Test2.txt', 'r') as f:
    text = f.read()

word_freq = collections.Counter(text.lower().split())
for word, freq in word_freq.most_common():
    print ("%-10s %d" % (word, freq))

没问题 - 你的回答就是我想说的,所以我只是添加了文档链接。 - Burhan Khalid
哇,非常感谢。我现在会尝试用你添加的链接去理解集合这个东西 :) - Fabster

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接