TypeError:“ range”和“ range”的实例之间不支持“ <”

时间:2019-02-27 17:15:25

标签: python google-colaboratory

我正在编写一段代码,根据它们的相关性返回前10个文档。但是我遇到了错误。我认为发生错误的代码是sorted_disc_max_10:

#sort the term frequency values in ascending order
    sorted_dic = sorted(tf.items(), key=operator.itemgetter(1), reverse=True)

    sorted_disc_max_10 = heapq.nlargest(10, sorted_dic,key=lambda s: range(1))

   #print the top 10 document IDs with the most f-idf weighting of a term
    for value in sorted_disc_max_10:
    print (value[0])

我收到的错误消息是:

  

TypeError:“ range”和“ range”的实例之间不支持“ <”

关于如何解决此问题的任何想法?预先谢谢你!

1 个答案:

答案 0 :(得分:2)

这正是错误发生的地方。实际上,它发生在lambda s: range(1)中。通常,key参数提供一个函数,该函数接受一个项目并返回一个值以对其进行排序。例如:

from collections import namedtuple

Person = namedtuple('Person', 'name age')

people = [
    Person('Bob', 35),
    Person('Sarah', 31),
    Person('Jane', 42),
]

people_sorted_by_age = sorted(people, key=lambda p: p.age)

在您的情况下,key=lambda s: range(1)返回range(1)作为要对sorted_dic中的每个项目进行比较的值。这实际上没有任何意义,因为使用常量值作为键不会随机播放任何项目(因此不会进行排序),但由于错误表明您无法比较range个对象:

>>> range(10) < range(1)
Traceback (most recent call last):
  ...
TypeError: '<' not supported between instances of 'range' and 'range'

在后台,nlargest正在使用<比较键值。但是无论如何,比较范围确实没有任何意义。您可能想通过其他方式进行比较。

但是在上一行中,您已经拥有tf中按item[1]for item in tf)排序的项目,因此您可能根本不需要nlargest 。已经排序了。

但是,如果您只需要最大的10个,则使用nlargest而不是进行排序以获得更有效的排序(因为它不会对整个列表进行排序):

sorted_dic = heapq.nlargest(10, tf.items(), key=operator.itemgetter(1))

如果tf中没有很多项目,sorted通常是比较惯用的方法。如果您想走那条路线,则可以从中剔除前10个项目:

sorted_dic = sorted(tf.items(), key=operator.itemgetter(1), reverse=True)[:10]