Han*_*son 7 python tuples list
我想从下面的元组列表中返回前6个名称(只有名称)和最高对应的整数.我已经能够将所有名称从最高(短信)返回到最低(老板).
[('sms', 10), ('bush', 9), ('michaels', 7), ('operations', 6), ('research', 5), ('code', 4), ('short', 3), ('ukandu', 2), ('technical', 1), ('apeh', 1), ('boss', 1)]
Run Code Online (Sandbox Code Playgroud)
谢谢.
mgi*_*son 11
heapq.nlargest 这就是你想要的:
import heapq
from operator import itemgetter
largest_names = [x[0] for x in heapq.nlargest(6,your_list,key=itemgetter(1))]
Run Code Online (Sandbox Code Playgroud)
它将比排序更有效,因为它只需要最大的元素并丢弃其余元素.当然,如果列表由于其他原因而预先排序,则它比切片效率低.
复杂:
说明:
heapq.nlargest(6,your_list,key=itemgetter(1))
Run Code Online (Sandbox Code Playgroud)
该行返回(名称,值)元组的列表,但只返回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)]
Run Code Online (Sandbox Code Playgroud)
可能不值得转换只是为了进行这种计算(毕竟这是heapq的用途;-),但是可能值得转换以使数据更易于使用.
如果数据已经排序,只需切掉前六个元组,然后获取名称:
first_six = data[0:6] # or data[:6]
only_names = [entry[0] for entry in first_six]
Run Code Online (Sandbox Code Playgroud)
列表理解可以展开为:
only_names = []
for entry in first_six:
only_names.append(entry[0])
Run Code Online (Sandbox Code Playgroud)
如果列表尚未排序,您可以使用该方法(或内置方法)key的关键字参数按分数排序:sortsorted
data.sort(key=lambda entry: entry[1], reverse=True)
Run Code Online (Sandbox Code Playgroud)
lambda是一个匿名函数 - 等价的是:
def get_score(entry):
return entry[1]
data.sort(key=get_score, reverse=True)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
590 次 |
| 最近记录: |