我想要从下面的元组列表中返回前6个名称(只有名称)和最高对应的整数。 我已经能够将所有名字从最高(短信)返回到最低(老板)。
[('sms', 10), ('bush', 9), ('michaels', 7), ('operations', 6), ('research', 5), ('code', 4), ('short', 3), ('ukandu', 2), ('technical', 1), ('apeh', 1), ('boss', 1)]
谢谢。
答案 0 :(得分:11)
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))
这一行返回(名称,值)元组的列表,但只返回6个最大的元组 - 比较由元组中的第二个(index = 1 - > key=itemgetter(1)
)元素完成。 / p>
该行的其余部分是对6个最大名称,值元组的列表理解,它只取元组的名称部分并将其存储在列表中。
您可能会感兴趣的是,您也可以将此数据存储为collections.Counter
。
d = collections.Counter(dict(your_list))
biggest = [x[0] for x in d.most_common(6)]
可能不值得转换只是为了进行这种计算(毕竟这就是heapq的用途;-),但是可能值得转换以使数据更易于使用。
答案 1 :(得分:4)
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 ... ]
创建每个传递元组的第一个元素列表; 答案 2 :(得分:1)
如果数据已经排序,只需切掉前六个元组,然后得到名称:
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)