排序一致性?

时间:2012-05-16 12:19:00

标签: 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()
        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个?我不允许导入resys以外的任何模块,我很难找到解决方案。

2 个答案:

答案 0 :(得分:1)

sorted是内置版,不需要导入。尝试类似:

list(sorted(concordance.items(), key = lambda (k,v): v))[:50]

未经测试,但您明白了。

list构造函数在那里,因为sorted返回一个生成器,你无法直接切片(itertools提供了一个实用程序来执行此操作,但是你无法导入它)

可能会有更有效的方法来获得前50个,但我怀疑这里有什么问题。

答案 1 :(得分:0)

几点提示:

  • 在for循环中使用enumerate(list)一次获取行号和行。
  • 尝试使用\w在正则表达式中使用单词字符,而不是列出[A-Za-z...]
  • 了解dict.items()方法。它将返回(key, value)对的列表。
  • 使用list.sort(key=function_to_compare_two_items)操作该列表。
  • 您可以使用lambda定义该功能,但这不是必需的。
  • 使用len(list)函数获取列表的长度。您可以使用它来获取单词的匹配数(存储在列表中)。
  • 更新:是的,并使用切片获取结果列表的一部分。 list[:50]获取前50个项目(相当于list[0:50]),list[5:10]获取从索引5包含到索引10的项目。
  • 要打印它们,请循环显示结果列表,然后打印每个单词。或者,您可以使用与print '[separator]'.join(list)类似的内容来打印字符串,其中所有项目都以“[separator]”分隔。
祝你好运。