Liste sortieren anhand der letzten vier ziffern Python?
Moin,
Ich bau gerade einen Discord Bot mit Python der unter anderem ausgeben kann wie viel Geld man hat und wer der Reichste aus dem Server ist. Das ist mein Code:
...
@bot.tree.command(name="leaderboard", description="shows the 10 richest players on the server and you")
async def leaderboard(interaction: discord.Interaction):
with open("user.txt", 'r') as datei:
autoren = datei.read().splitlines()
data = ""
self_data = ""
print(autoren)
for autor in autoren:
data += f"<@{autor[:-5]}>: {autor[-4:]}$\n"
if autor[:-5] == str(interaction.user.id):
self_data += f"<@{autor[:-5]}>: {autor[-4:]}$\n"
await interaction.response.send_message(f'>>>Die reichsten 10:\n{data}\n\nDu selbst:\n{self_data}', ephemeral=True)
...
die autoren liste sieht so aus
['838093888338133065 8971', '781949995494146048 9182']
die ersten ziffern sind dabei die user id und die hinteren 4 ziffern stellen das geld der user da.
Mein Problem ist, dass ich es nicht hinbekomme die liste autoren anhand der letzten 4 Ziffern der größe nach (von groß zu klein) zu sortieren. Am ende sollen die Benutzter halt sortiert wie ein leaderbord ausgegeben werden.
lg
3 Antworten
Wie andere bereits schrieben, wäre es gut das in ein gescheites strukturiertes Format zu überführen, aber:
somelist.sort(key=lambda v:int(v[-4:])
wäre eine Möglichkeit.
Davon ab:
# autoren = datei.read().splitlines()
# for autor in autoren:
for autor in datei:
Textdateien sind direkt iterierbar.
Nachtrag, ich hatte beim Slice den Doppelpunkt vergessen.
Du machst ein Split auf den String, wandelst den hinteren Teil in eine Zahl um und vergleichst dann die Zahlenwerte.
die ersten ziffern sind dabei die user id und die hinteren 4 ziffern stellen das geld der user da.
Kann man so in einer Datei speichern, aber es wäre sinnvoll sowas im Programm gleich in einen strukturierten Datentyp umzuwandeln, etwa ein Dictionary oder wenigstens eine Liste. Sonst murkst du doch dauernd mühsam mit Slices herum.
Etwa in diese Richtung:
autoren_dicts = [{'user':autor[:-5], 'money':int(autor[-4:])} for autor in autoren]
Eine sortierte Ansicht kriegst du dann bequem so:
sorted(autoren_dicts, key=lambda a:a['money'])