请从下面的元组列表中返回具有最高对应整数的前6个名称(仅为名称)。我已经能够返回所有的名字从最高(短信)到最低(老板)。
[('sms', 10), ('bush', 9), ('michaels', 7), ('operations', 6), ('research', 5), ('code', 4), ('short', 3), ('ukandu', 2), ('technical', 1), ('apeh', 1), ('boss', 1)]谢谢。
发布于 2012-10-09 13:45:25
heapq.nlargest就是你在这里想要的:
import heapq
from operator import itemgetter
largest_names = [x[0] for x in heapq.nlargest(6,your_list,key=itemgetter(1))]它将比排序更有效率,因为它只需要最大的元素并丢弃其余的元素。当然,如果由于其他原因,列表是预先排序的,那么它的效率就不如切片。
复杂性:
解释:
heapq.nlargest(6,your_list,key=itemgetter(1)) 这一行返回(name,value)元组的列表,但只有6个最大的元组--比较由元组中的第二个元素(index=1 -> key=itemgetter(1))完成。
行的其余部分是一个列表-对6个最大名称的理解,值元组,它只取元组的名称部分并将其存储在一个列表中。
您可能感兴趣的是,您也可以将这些数据存储为collections.Counter。
d = collections.Counter(dict(your_list))
biggest = [x[0] for x in d.most_common(6)]可能不值得仅仅为了进行这种计算而进行转换(这毕竟是heapq的作用;-),但可能值得进行转换,以使数据更易于使用。
发布于 2012-10-09 13:44:53
data=[('sms', 10), ('bush', 9), ('michaels', 7), ('operations', 6), ('research', 5), ('code', 4), ('short', 3), ('ukandu', 2), ('technical', 1), ('apeh', 1), ('boss', 1)]
return [x[0] for x in sorted(data, key=lambda x: x[1], reverse=True)[0:6]]具体如下:
sorted返回使用key函数排序的数据。由于标准排序顺序是从升序开始的,所以reverse=True将其设置为降序;lambda x: x[1]是匿名函数,它返回参数的第二个元素(在本例中是元组的);itemgetter(1)是更好的方法,但需要额外的导入;[0:6]切片前6个元素的列表;[x[0] for x in ... ]创建每个传递的元组的第一个元素的列表;发布于 2012-10-09 13:43:48
如果数据已经被排序,只需将前六个元组分割,然后获取名称:
first_six = data[0:6] # or data[:6]
only_names = [entry[0] for entry in first_six]列表理解可以展开为:
only_names = []
for entry in first_six:
only_names.append(entry[0])如果列表尚未排序,则可以使用sort方法(或sorted内置)的sort关键字参数按分数进行排序:
data.sort(key=lambda entry: entry[1], reverse=True)lambda是一个匿名函数--等价于:
def get_score(entry):
return entry[1]
data.sort(key=get_score, reverse=True)https://stackoverflow.com/questions/12801444
复制相似问题