我希望这段代码可以读取文本文件,并打印每个单词以百分比形式出现的数量。 几乎有效..
我无法弄清楚如何将打印输出从最高位置排序到最少(当我复制/粘贴其他人的代码时我曾经有过它,我想我导入了集合和计数器,我不知道)
但是另一个问题是它通过我的整个列表读取,这对于较小的文本文件很好,但是较大的文本只会占用我的终端,我希望它只打印一次单词,而不是每个实例打印一次
name = raw_input('Enter file:')
handle = open(name, 'r')
text = handle.read()
words = text.split()
def percent(part, whole):
return 100 * float(part)/float(whole)
total = len(words)
counts = dict()
for word in words:
counts[word] = counts.get(word,0) + 1
print "\n"
print"Total Words\n", total
print"\n"
for word in words:
print word, percent(counts[word],total),"%"
答案 0 :(得分:1)
您可以像这样迭代字典:
for word in counts:
print word, counts[word]
这将打印字典中的每个键一次。
要进行排序,您应该查看内置的sorted()
函数:https://docs.python.org/3.4/library/functions.html#sorted
答案 1 :(得分:0)
对于您的第一个问题,您可以直接收集OrderedDict:
sortedCounts = collections.OrderedDict(sorted(counts.items(),key=lambda t: t[1]))
仅打印每个单词一次:
for key, value in sortedCounts.iteritems():
print key, percent(value,total),"%"
希望有所帮助
答案 2 :(得分:0)
您的代码非常接近可行;我只看到一些导致您出现问题的问题:
P1:您的代码不会考虑非单词字符。例如,word;
,word.
和word
都将被视为唯一字词。
text = handle.read()
words = text.split()
P2:您遍历整个单词列表,其中包括重复项,而不是counts
中的唯一列表。所以你当然会多次打印每个单词。
for word in words:
P3:您打开文件但从未关闭它。您的代码不完全是问题,但需要改进。这就是为什么通常鼓励使用with open(...):
语法,因为它处理为您关闭文件。
handle = open(name, 'r')
这是您的代码中的一些修复:
#!/usr/bin/python
import re
name = raw_input('Enter file:')
def percent(part, whole):
return 100 * float(part)/float(whole)
# better way to open files, handles closing the file
with open(name, 'r') as handle:
text = handle.read()
words = text.split()
# get rid of non-word characters that are messing up count
formatted = []
for w in words:
formatted.extend(re.findall(r'\w+', w))
total = len(formatted)
counts = dict()
for word in formatted:
counts[word] = counts.get(word,0) + 1
print "\n"
print"Total Words\n", total
print"\n"
# iterate over the counts dict instead of the original word list
# this way each word is only printed once
for word,count in counts.iteritems():
print word, percent(counts[word],total),"%"
在此程序上运行时的输出:
Total Words
79
text 2.53164556962 %
float 2.53164556962 %
as 1.26582278481 %
file 1.26582278481 %
in 3.79746835443 %
handle 2.53164556962 %
counts 6.32911392405 %
total 3.79746835443 %
open 1.26582278481 %
findall 1.26582278481 %
for 3.79746835443 %
0 1.26582278481 %
percent 2.53164556962 %
formatted 5.06329113924 %
1 1.26582278481 %
re 2.53164556962 %
dict 1.26582278481 %
usr 1.26582278481 %
Words 1.26582278481 %
print 5.06329113924 %
import 1.26582278481 %
split 1.26582278481 %
bin 1.26582278481 %
return 1.26582278481 %
extend 1.26582278481 %
get 1.26582278481 %
python 1.26582278481 %
len 1.26582278481 %
iteritems 1.26582278481 %
part 2.53164556962 %
words 2.53164556962 %
Enter 1.26582278481 %
100 1.26582278481 %
with 1.26582278481 %
count 1.26582278481 %
word 7.59493670886 %
name 2.53164556962 %
read 1.26582278481 %
raw_input 1.26582278481 %
n 3.79746835443 %
r 1.26582278481 %
w 3.79746835443 %
Total 1.26582278481 %
whole 2.53164556962 %
def 1.26582278481 %
formatted.extend(re.findall(r'\w+', w))
的细分:
1:列表的extend
函数获取一个列表并将其附加到给定列表中。例如:
listA = [1,2,3]
listB = [4,5,6]
listA.extend(listB)
print(listA)
# [1, 2, 3, 4, 5, 6]
2:re.findall(r'\w+', w))
此表达式使用regular expressions仅提取我们关心的字符串部分。这是关于python正则表达式的tutorial。
基本上,re.findall(x, y)
会返回y
中与x
中列出的正则表达式模式匹配的所有子字符串的列表。在我们的例子中,\w
表示所有单词字符(即字母数字字符),+
表示前述模式中的一个或多个。所以放在一起,\w+
表示一个或多个单词字符。
我可能通过命名我们在w
上进行搜索的字符串变量来使其有些混乱,但请记住,模式中的\w
与{无关联} {1}}变量即字符串。
w