2012-10-09 18 views
7

Vui lòng trả lại 6 tên đầu tiên (chỉ có tên) với số nguyên tương ứng cao nhất từ ​​danh sách bộ dữ liệu bên dưới. Tôi đã có thể trả lại tất cả các tên từ cao nhất (sms) xuống thấp nhất (sếp).Trả lại 6 tên cao nhất trong Danh sách bộ tảo bằng Python

[('sms', 10), ('bush', 9), ('michaels', 7), ('operations', 6), ('research', 5), ('code', 4), ('short', 3), ('ukandu', 2), ('technical', 1), ('apeh', 1), ('boss', 1)] 

Cảm ơn bạn.

Trả lời

1

Nếu dữ liệu đã được sắp xếp đơn giản là cắt ra sáu tuples đầu tiên và sau đó nhận được những cái tên:

first_six = data[0:6] # or data[:6] 
only_names = [entry[0] for entry in first_six] 

Danh sách hiểu biết có thể được trải ra để:

only_names = [] 
for entry in first_six: 
    only_names.append(entry[0]) 

Nếu danh sách là không phải đã được sắp xếp, bạn có thể sử dụng đối số từ khóa key của phương pháp sort (hoặc tích hợp sorted) để sắp xếp theo điểm số:

data.sort(key=lambda entry: entry[1], reverse=True) 

lambda là một chức năng ẩn danh - tương đương là:

def get_score(entry): 
    return entry[1] 

data.sort(key=get_score, reverse=True) 
+1

Không cần phải bao gồm số 0 trong lát đó, thậm chí .. –

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]] 

Mà không sau:

  • sorted trả về dữ liệu được sắp xếp sử dụng key chức năng. Vì thứ tự sắp xếp chuẩn từ tăng dần, reverse=True đặt nó giảm dần;
  • lambda x: x[1] là hàm ẩn danh trả về phần tử thứ hai của đối số (trong bộ tuple trong trường hợp này); itemgetter(1) là cách tốt hơn để thực hiện việc này, nhưng yêu cầu nhập khẩu bổ sung;
  • [0:6] lát 6 thành phần đầu tiên của danh sách;
  • [x[0] for x in ... ] tạo danh sách các thành phần đầu tiên của mỗi bộ được truyền;
+0

Sẽ rất tuyệt nếu bạn có thể giải thích mã của mình. Nó có thể là khó khăn cho người mới bắt đầu để hiểu những gì đang xảy ra. – WarrenFaith

11

heapq.nlargest là những gì bạn muốn ở đây:

import heapq 
from operator import itemgetter 
largest_names = [x[0] for x in heapq.nlargest(6,your_list,key=itemgetter(1))] 

Nó sẽ hiệu quả hơn so với sắp xếp vì nó chỉ mất những yếu tố lớn nhất và loại bỏ phần còn lại. Tất nhiên, nó kém hiệu quả hơn việc cắt nếu danh sách được sắp xếp trước vì các lý do khác.

phức tạp:

  • heapq: O (N)
  • sắp xếp: O (NlogN)
  • cắt (chỉ khi trước sắp xếp): O (6)

Giải thích :

heapq.nlargest(6,your_list,key=itemgetter(1)) 

Dòng này trả về danh sách (tên, giá trị) tu ples, nhưng chỉ có 6 cái lớn nhất - so sánh được thực hiện bởi phần tử thứ hai (index = 1 ->key=itemgetter(1)) trong tuple.

Phần còn lại của dòng là danh sách hiểu trên 6 tên lớn nhất, bộ giá trị chỉ lấy phần tên của bộ dữ liệu và lưu trữ nó trong danh sách.


Có thể bạn quan tâm đến việc bạn có thể lưu trữ dữ liệu này dưới dạng collections.Counter.

d = collections.Counter(dict(your_list)) 
biggest = [x[0] for x in d.most_common(6)] 

Có lẽ không đáng chuyển đổi chỉ để làm tính toán này (đó là những gì heapq là sau khi tất cả ;-), nhưng nó có thể có giá trị chuyển đổi để làm cho dữ liệu dễ dàng hơn để làm việc với.

+1

Chắc chắn là sử dụng tốt heapq và giải thích +1 –