Files
SpotifyRecAlg/swingmusic/utils/bisection.py
T
Tomas Dvorak 6e8fedf534 first commit
2026-04-13 17:46:58 +02:00

47 lines
985 B
Python

from typing import TypeVar
T = TypeVar("T")
def use_bisection(
source: list[T], key: str, queries: list[str], limit: int = -1
) -> list[T | None]:
"""
Uses bisection to find a list of items in another list.
Returns a list of found items with `None` items being not found items.
"""
def find(query: str):
left = 0
right = len(source) - 1
while left <= right:
mid = (left + right) // 2
if source[mid].__getattribute__(key) == query:
return source[mid]
elif source[mid].__getattribute__(key) > query:
right = mid - 1
else:
left = mid + 1
return None
if len(source) == 0:
return []
results = []
for query in queries:
res = find(query)
if res is None:
continue
results.append(res)
if limit != -1 and len(results) >= limit:
break
return results