请我想从下面的元组列表中返回具有最高对应整数的前 6 个名称(仅名称)。我已经能够返回从最高(短信)到最低(老板)的所有名字。
[('sms', 10), ('bush', 9), ('michaels', 7), ('operations', 6), ('research', 5), ('code', 4), ('short', 3), ('ukandu', 2), ('technical', 1), ('apeh', 1), ('boss', 1)]
谢谢你。
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 个最大的 - 比较由key=itemgetter(1)
元组中的第二个 (index=1 --> ) 元素完成。
该行的其余部分是对 6 个最大名称、值元组的列表理解,它只获取元组的名称部分并将其存储在列表中。
您可能会感兴趣的是,您也可以存储这些数据collections.Counter
。
d = collections.Counter(dict(your_list))
biggest = [x[0] for x in d.most_common(6)]
仅仅为了做这个计算可能不值得转换(这毕竟是 heapq 的用途 ;-),但它可能值得转换以使数据更易于使用。
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 ... ]
创建每个传递的元组的第一个元素的列表;如果数据已经排序,只需切掉前六个元组,然后获取名称:
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])
如果列表尚未排序,您可以使用方法(或内置)的key
关键字参数按分数排序:sort
sorted
data.sort(key=lambda entry: entry[1], reverse=True)
lambda
是一个匿名函数 - 等价于:
def get_score(entry):
return entry[1]
data.sort(key=get_score, reverse=True)