Python 排序一致性?
对于我的家庭作业,我需要分离出一篇课文中最常见的50个单词。我已经尝试了很多方法,在我最近的尝试中,我使用以下方法进行了协调:Python 排序一致性?,python,sorting,frequency,Python,Sorting,Frequency,对于我的家庭作业,我需要分离出一篇课文中最常见的50个单词。我已经尝试了很多方法,在我最近的尝试中,我使用以下方法进行了协调: concordance = {} lineno = 0 for line in vocab: lineno = lineno + 1 words = re.findall(r'[A-Za-z][A-Za-z\'\-]*', line) for word in words: word = word.title()
concordance = {}
lineno = 0
for line in vocab:
lineno = lineno + 1
words = re.findall(r'[A-Za-z][A-Za-z\'\-]*', line)
for word in words:
word = word.title()
if word in concordance:
concordance[word].append(lineno)
else:
concordance[word] = [lineno]
listing = []
for key in sorted(concordance.keys()):
listing.append( [key, concordance[key] ])
我想知道的是,我是否能够按照使用频率最高的单词到使用频率最低的单词的顺序对随后的一致性进行排序,然后分离并打印出前50个单词?除了
re
和sys
之外,我不允许导入任何模块,我正在努力想出一个解决方案 排序的
是一个内置的,不需要导入。尝试以下方法:
list(sorted(concordance.items(), key = lambda (k,v): v))[:50]
没有经过测试,但你明白了
之所以有列表
构造函数,是因为排序
返回一个生成器,您无法直接对其进行切片(itertools
提供了一个实用程序,但无法导入它)
也许有更有效的方法来解决前50个问题,但我怀疑这是否重要。几点提示:
- 在for循环中使用
立即获取行号和行号enumerate(list)
- 尝试对正则表达式中的单词字符使用
,而不是列出\w
[A-Za-z..]
- 阅读
方法。它将返回dict.items()
对的列表(键、值)
- 使用
操作该列表list.sort(key=function\u比较\u两个\u项)
- 您可以使用
定义该函数,但这不是必需的lambda
- 使用
函数获取列表的长度。您可以使用它来获取单词的匹配数(存储在列表中)len(list)
- 更新:哦,是的,使用切片获取结果列表的一部分
获取前50个项目(相当于list[:50]
),以及list[0:50]
获取从索引5(包括)到索引10(不包括)的项目list[5:10]
- 要打印它们,请在结果列表中循环,然后打印每个单词。或者,您可以使用类似于
打印一个字符串,其中所有项目都用“[separator]”分隔打印“[separator]”的内容。join(list)
祝你好运。在本例中,v是行号列表。你可能想要
key=lambda(k,v):len(v)
@mgilson对,就像我说的,未经测试,而且无论如何,我不想只给出家庭作业的答案。@mgilson还有,试试[1,2,3]>[1,2]
dict.items()
在Python2.x中返回一个列表,在Python3.x中返回一个迭代器——这只是为了避免使用Python3的人感到困惑。x@mgilson正确,如果您使用的是python 3.x,请使用list(dict.items())
。谢谢。次要pythonic point:您的if语句可以替换为.setdefault()。