Python Language
Heapq
Sök…
Största och minsta föremål i en samling
För att hitta de största artiklarna i en samling har heapq
modulen en funktion som kallas nlargest
, vi nlargest
den två argument, den första är antalet objekt som vi vill hämta, den andra är samlingsnamnet:
import heapq
numbers = [1, 4, 2, 100, 20, 50, 32, 200, 150, 8]
print(heapq.nlargest(4, numbers)) # [200, 150, 100, 50]
På samma sätt använder vi nsmallest
funktionen för att hitta de minsta artiklarna i en samling:
print(heapq.nsmallest(4, numbers)) # [1, 2, 4, 8]
Både nlargest
och nsmallest
funktionerna tar ett valfritt argument (nyckelparameter) för komplicerade datastrukturer. Följande exempel visar användningen av age
egendom för att hämta den äldsta och de yngsta människor från people
Ordbok:
people = [
{'firstname': 'John', 'lastname': 'Doe', 'age': 30},
{'firstname': 'Jane', 'lastname': 'Doe', 'age': 25},
{'firstname': 'Janie', 'lastname': 'Doe', 'age': 10},
{'firstname': 'Jane', 'lastname': 'Roe', 'age': 22},
{'firstname': 'Johnny', 'lastname': 'Doe', 'age': 12},
{'firstname': 'John', 'lastname': 'Roe', 'age': 45}
]
oldest = heapq.nlargest(2, people, key=lambda s: s['age'])
print(oldest)
# Output: [{'firstname': 'John', 'age': 45, 'lastname': 'Roe'}, {'firstname': 'John', 'age': 30, 'lastname': 'Doe'}]
youngest = heapq.nsmallest(2, people, key=lambda s: s['age'])
print(youngest)
# Output: [{'firstname': 'Janie', 'age': 10, 'lastname': 'Doe'}, {'firstname': 'Johnny', 'age': 12, 'lastname': 'Doe'}]
Minsta artikel i en samling
Den mest intressanta egenskapen hos en heap
är att dess minsta element alltid är det första elementet: heap[0]
import heapq
numbers = [10, 4, 2, 100, 20, 50, 32, 200, 150, 8]
heapq.heapify(numbers)
print(numbers)
# Output: [2, 4, 10, 100, 8, 50, 32, 200, 150, 20]
heapq.heappop(numbers) # 2
print(numbers)
# Output: [4, 8, 10, 100, 20, 50, 32, 200, 150]
heapq.heappop(numbers) # 4
print(numbers)
# Output: [8, 20, 10, 100, 150, 50, 32, 200]
Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow