2012-03-18 37 views
5

Tôi muốn tạo danh sách maxValues ​​ chứa 20 giá trị hàng đầu từ danh sách số nguyên lst.Lọc tối đa 20 giá trị từ danh sách các số nguyên

maxValues = [] 
for i in range(20): 
    maxValues.append(max(lst)) 
    lst.remove(max(lst)) 

Có mã nhỏ gọn hơn để đạt được nhiệm vụ này hoặc thậm chí chức năng tích hợp sẵn không?

+2

Nó không chỉ nhỏ gọn. Mã của bạn (nếu được sửa, câu lệnh 'del' sai) là O (n * k), trong khi các phương thức khác là O (nlogn). – agf

+0

@agf, Cảm ơn bạn đã sửa chữa. – xralf

Trả lời

12

heapq.nlargest():

maxvalues = heapq.nlargest(20, lst) 

Từ doc:

heapq.nlargest(n, iterable, key=None)

Return một danh sách với n yếu tố lớn nhất từ ​​thứ e tập dữ liệu được xác định bởi iterable. key, nếu được cung cấp, xác định một chức năng của một đối số được sử dụng để trích xuất một phím so sánh từ mỗi phần tử trong iterable: key=str.lower Tương đương với: sorted(iterable, key=key, reverse=True)[:n]

Hoặc ít giống như cách sử dụng heapq.nsmallest() nếu bạn muốn nhỏ nhất.

LƯU Ý QUAN TRỌNGfrom the doc:

Sau đó hai chức năng [nlargestnsmallest] hiệu suất tốt nhất cho các giá trị nhỏ hơn của n. Đối với các giá trị lớn hơn, sử dụng chức năng sorted() hiệu quả hơn. Ngoài ra, khi n==1, việc sử dụng các chức năng min()max() hiệu quả hơn sẽ hiệu quả hơn.

+0

Cảm ơn. Điều đó tốt hơn câu trả lời của tôi. Có khả năng nhanh hơn khi danh sách rất dài vì không cần phải sắp xếp toàn bộ danh sách. –

+0

@ Rémi: Tôi đã thêm một ghi chú từ tài liệu so sánh khi hai giải pháp. –

+0

Cảm ơn bạn đã trả lời đầy đủ. – xralf

5
sorted(lst)[-20:] 

là ngắn nhất tôi có thể nghĩ đến. Có khả năng nhanh hơn.

(chỉnh sửa: đầu tiên cố gắng tìm thấy những phút thay vì max)

+0

Tôi chấp nhận câu trả lời khác vì nó hoàn chỉnh hơn nhưng tôi đã sử dụng giải pháp nhanh đơn giản của bạn. – xralf

Các vấn đề liên quan