Find the n largest elements in a dataset. Equivalent to: sorted(iterable, key=key, reverse=True)[:n]
(n, iterable, key=None)
| 535 | return [elem for (k, order, elem) in result] |
| 536 | |
| 537 | def nlargest(n, iterable, key=None): |
| 538 | """Find the n largest elements in a dataset. |
| 539 | |
| 540 | Equivalent to: sorted(iterable, key=key, reverse=True)[:n] |
| 541 | """ |
| 542 | |
| 543 | # Short-cut for n==1 is to use max() |
| 544 | if n == 1: |
| 545 | it = iter(iterable) |
| 546 | sentinel = object() |
| 547 | result = max(it, default=sentinel, key=key) |
| 548 | return [] if result is sentinel else [result] |
| 549 | |
| 550 | # When n>=size, it's faster to use sorted() |
| 551 | try: |
| 552 | size = len(iterable) |
| 553 | except (TypeError, AttributeError): |
| 554 | pass |
| 555 | else: |
| 556 | if n >= size: |
| 557 | return sorted(iterable, key=key, reverse=True)[:n] |
| 558 | |
| 559 | # When key is none, use simpler decoration |
| 560 | if key is None: |
| 561 | it = iter(iterable) |
| 562 | result = [(elem, i) for i, elem in zip(range(0, -n, -1), it)] |
| 563 | if not result: |
| 564 | return result |
| 565 | heapify(result) |
| 566 | top = result[0][0] |
| 567 | order = -n |
| 568 | _heapreplace = heapreplace |
| 569 | for elem in it: |
| 570 | if top < elem: |
| 571 | _heapreplace(result, (elem, order)) |
| 572 | top, _order = result[0] |
| 573 | order -= 1 |
| 574 | result.sort(reverse=True) |
| 575 | return [elem for (elem, order) in result] |
| 576 | |
| 577 | # General case, slowest method |
| 578 | it = iter(iterable) |
| 579 | result = [(key(elem), i, elem) for i, elem in zip(range(0, -n, -1), it)] |
| 580 | if not result: |
| 581 | return result |
| 582 | heapify(result) |
| 583 | top = result[0][0] |
| 584 | order = -n |
| 585 | _heapreplace = heapreplace |
| 586 | for elem in it: |
| 587 | k = key(elem) |
| 588 | if top < k: |
| 589 | _heapreplace(result, (k, order, elem)) |
| 590 | top, _order, _elem = result[0] |
| 591 | order -= 1 |
| 592 | result.sort(reverse=True) |
| 593 | return [elem for (k, order, elem) in result] |
| 594 |