{"id":16949683,"url":"https://github.com/tailhook/sortedsets","last_synced_at":"2025-07-21T12:32:36.116Z","repository":{"id":6069271,"uuid":"7295169","full_name":"tailhook/sortedsets","owner":"tailhook","description":"Sorted sets implementation in pure python","archived":false,"fork":false,"pushed_at":"2015-12-04T14:10:10.000Z","size":17,"stargazers_count":11,"open_issues_count":1,"forks_count":2,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-03-25T16:15:59.693Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/tailhook.png","metadata":{"files":{"readme":"README.rst","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2012-12-23T13:28:09.000Z","updated_at":"2021-02-01T01:46:02.000Z","dependencies_parsed_at":"2022-09-26T20:32:00.551Z","dependency_job_id":null,"html_url":"https://github.com/tailhook/sortedsets","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tailhook%2Fsortedsets","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tailhook%2Fsortedsets/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tailhook%2Fsortedsets/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tailhook%2Fsortedsets/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/tailhook","download_url":"https://codeload.github.com/tailhook/sortedsets/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248173848,"owners_count":21059595,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-10-13T21:55:49.235Z","updated_at":"2025-04-11T20:20:35.695Z","avatar_url":"https://github.com/tailhook.png","language":"Python","readme":"==========\nSortedSets\n==========\n\n\nSorted set is data structure that maps unique keys to scores. The following\noperations are allowed on sorted set:\n\n* Iteration in order or scores (both ascending and descending)\n* Get score for key (same performance as for dict)\n* Get index for key (O(log n), n is sizeof the set)\n* Get key for index (O(log n))\n* Slicing by index (O(m + log n), m is length of slice)\n* Slicing by score (O(m + log n), m is length of slice)\n* Item/slice deletion by index and score (same performance as for slicing)\n* Insertion with any score has O(log n) performance too\n\nThe data structure is modelled closely after Redis' sorted sets. Internally it\nconsists of a mapping between keys and scores, and a skiplist for scores.\n\nThe use cases for SortedSets are following:\n\n* Leaderboard for a game\n* Priority queue (that support task deletion)\n* Timer list (supports deletion too)\n* Caches with TTL-based, LFU or LRU eviction\n* Search databases with relevance scores\n* Statistics\n* Replacement for ``collections.Counter`` with faster ``most_common()``\n\n\nExample Code\n============\n\nLet's model a leaderboard::\n\n    \u003e\u003e\u003e from sortedsets import SortedSet\n    \u003e\u003e\u003e ss = SortedSet()\n\nInsert some players into sortedset (with some strange made up scores)::\n\n    \u003e\u003e\u003e for i in range(1, 1000):\n    ...    ss['player' + str(i)] = i*10 if i % 2 else i*i\n    ...\n\nLet's find out score for player::\n\n    \u003e\u003e\u003e ss['player20'], ss['player21']\n    (400, 210)\n\nLet's find out their rating positions::\n\n    \u003e\u003e\u003e ss.index('player20'), ss.index('player21')\n    (29, 17)\n\nLet's find out players that have score similar to one's::\n\n    \u003e\u003e\u003e ss['player49']\n    490\n    \u003e\u003e\u003e ss.by_score[470:511]\n    \u003cSortedSet {'player22': 484, 'player47': 470, 'player49': 490, 'player51': 510}\u003e\n    \u003e\u003e\u003e for k, v in _.items():\n    ...   print(k, v)\n    ...\n    player47 470\n    player22 484\n    player49 490\n    player51 510\n\nLet's find out players on the rating page 25::\n\n    \u003e\u003e\u003e page, pagesize = 25, 10\n    \u003e\u003e\u003e ss.by_index[page*pagesize:page*pagesize + pagesize]\n    \u003cSortedSet {'player437': 4370, 'player439': 4390, 'player441': 4410, 'player443': 4430, ...}\u003e\n    \u003e\u003e\u003e len(_)\n    10\n\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftailhook%2Fsortedsets","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftailhook%2Fsortedsets","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftailhook%2Fsortedsets/lists"}