Problem beim Sortieren eines Arrays
Verfasst: Freitag 16. Oktober 2020, 20:18
Hallo,
ich versuche gerade ein Programm zu schreiben, bei dem der Anwender die Mannschaften einer Liga eingibt, die in einer Text-Datei gespeichert werden. Anschließend können die Mannschaften aufgerufen werden. Es kann dann eingegeben werden, wer gegen wen gespielt hat und wie das Ergebnis war.
Bis zu Zeile funktioniert alles.
Nach dieser Zeile muss das Array sortiert werden. Hier muss nach drei Spalten sortiert werden: Tore, Tordifferenz und Punkte. Nicht nacheinander sondern "verbunden". Gibt es hierfür einen Fachbegriff?
Das bekomme ich leider nicht hin, wie ihr an den folgenden Code-Zeilen sehen könnt.
Ich würde mich sehr freuen, wenn mir jemand weiterhelfen könnte.
Viele Grüße
ich versuche gerade ein Programm zu schreiben, bei dem der Anwender die Mannschaften einer Liga eingibt, die in einer Text-Datei gespeichert werden. Anschließend können die Mannschaften aufgerufen werden. Es kann dann eingegeben werden, wer gegen wen gespielt hat und wie das Ergebnis war.
Code: Alles auswählen
import inspect
import numpy as np
def line_info():
f = inspect.currentframe()
g = inspect.getframeinfo(f.f_back)
print(f"Hier ist die Zeilennummer: {g.lineno} called from {g.function}")
def variablennullsetzung():
global tore_i
tore_i = 0
global tore_j
tore_j = 0
global gegentore_i
gegentore_i = 0
global gegentore_j
gegentore_j = 0
global anzahl_spiele_i
anzahl_spiele_i = 0
global anzahl_spiele_j
anzahl_spiele_j = 0
global spiele_gewonnen_i
spiele_gewonnen_i = 0
global spiele_gewonnen_j
spiele_gewonnen_j = 0
global spiele_remis_i
spiele_remis_i = 0
global spiele_remis_j
spiele_remis_j = 0
global spiele_verloren_i
spiele_verloren_i = 0
global spiele_verloren_j
spiele_verloren_j = 0
global punkte_i
punkte_i = 0
global punkte_j
punkte_j = 0
variablennullsetzung()
# belegte Variablen: a, b, c, e, i, j
# Hier beginnt das Hauptprogramm
mannschaftsanzahl = 4
tabelle_lfd_nr = []
mannschaftsnamen = []
eingegebene_kennzahlen = []
spieledaten = []
tabelle = []
anzahl_spiele = 0
spiele_gewonnen = 0
spiele_remis = 0
spiele_verloren = 0
tore = 0
gegentore = 0
tordifferenz = 0
punkte = 0
# Abfrage "neue Tabelle anlegen" ja oder nein
while True:
try:
Abfrage_neue_Tabelle = input(
"Willst du eine neue Tabelle anlegen? \n Gebe j für oder n für nein ein: "
)
except ValueError:
pass
else:
if Abfrage_neue_Tabelle == "j" or Abfrage_neue_Tabelle == "n":
break
print(line_info(), "Das war keine gültige Eingabe\n")
print("\n")
# Hier endet das Hauptprogramm
# Hier beginnt die Schleife Abfrage_neue_Tabelle=="j"
if Abfrage_neue_Tabelle == "j":
lfd_nr = 1
tabelle_lfd_nr.append(lfd_nr)
with open("vergebene laufende Nummern.txt", "w", encoding="utf-8") as output:
output.write(f"{lfd_nr}")
for a in range(0, mannschaftsanzahl):
mannschaftsname = input(f"Gebe den Namen der {a + 1}. Mannschaft ein")
print((line_info()), f"Der Name der {a + 1}. Mannschaft ist: {mannschaftsname}")
mannschaftsnamen.append(mannschaftsname)
print("\n")
mannschaftsnamen.sort()
with open("Mannschaftsnamen.txt", "w", encoding="utf-8") as output:
for mannschaftsname in mannschaftsnamen:
output.write(f"{mannschaftsname}\n")
mannschaftsnamen = []
with open("Mannschaftsnamen.txt", encoding="utf-8") as lines:
for line in lines:
mannschaftsnamen.append(line.rstrip())
print(line_info(), "mannschaftsnamen:", mannschaftsnamen)
print("\n")
# Hier endet die Schleife Abfrage_neue_Tabelle=="j"
# Hier beginnt die Schleife Abfrage_neue_Tabelle=="n"
if Abfrage_neue_Tabelle == "n":
mannschaftsnamen = []
with open("Mannschaftsnamen.txt", encoding="utf-8") as lines:
for line in lines:
mannschaftsnamen.append(line.rstrip())
print(line_info(), "Mannschaftsnamen: ", mannschaftsnamen)
with open("vergebene laufende Nummern.txt", encoding="utf-8") as lines:
for line in lines:
tabelle_lfd_nr.append(line.rstrip())
print(line_info(), "tabelle_lfd_nr = ", tabelle_lfd_nr)
# Hier beginnt das Hauptprogramm
b = int(mannschaftsanzahl / 2)
for c in range(0, b):
while True:
try:
i = int(input("Gebe die Kennzahl für die Heimmannschaft ein: "))
except ValueError:
pass
else:
if 0 < i <= mannschaftsanzahl and i not in eingegebene_kennzahlen:
break
print(line_info(), "Das war keine gültige Zahl. Versuche es noch einaml.....")
print("\n")
eingegebene_kennzahlen.append(i)
print(line_info(), "eingegebene_kennzahlen: ", eingegebene_kennzahlen)
print(line_info(), "Die Heimmannschaft (i) lautet: ", mannschaftsnamen[i - 1])
while True:
try:
j = int(input("Gebe die Kennzahl für die Auswärtsmannschaft ein: "))
except ValueError:
pass
else:
if 0 < j <= mannschaftsanzahl and j != i and j not in eingegebene_kennzahlen:
break
print(line_info(), "Das war keine gültige Zahl. Versuche es noch einaml.....")
print("\n")
eingegebene_kennzahlen.append(j)
print(line_info(), "eingegebene_kennzahlen: ", eingegebene_kennzahlen)
print(line_info(), "Die Auswärtsmannschaft (j) lautet: ", mannschaftsnamen[j - 1])
kennzahlenpaarung = [i, j]
print(line_info(), "Kennzahlenpaarung: ", kennzahlenpaarung)
paarung = [mannschaftsnamen[i - 1], mannschaftsnamen[j - 1]]
print(line_info(), "Die Paarung lautet: ", paarung)
print(line_info(), "Die Paarung lautet: ", mannschaftsnamen[i - 1], ":", mannschaftsnamen[j - 1])
# Eingabe Tore Heimmannschaft
while True:
try:
tore_a = int(input("Gebe die Tore der Heimmannschaft ein: "))
break
except ValueError:
print(line_info(), "Das war keine gültige Zahl. Versuche es nocheinmal.....")
print("\n")
print(line_info(), "Die Heimmannschaft lautet: ", mannschaftsnamen[i - 1])
print("\n")
# Eingabe Tore Auswärtsmannschaft
while True:
try:
tore_b = int(input("Gebe die Tore der Auswärtsmannschaft ein: "))
break
except ValueError:
print(line_info(), "Das war keine gültige Zahl. Versuche es nocheinmal.....")
print("\n")
print(line_info(), "Die Heimmannschaft lautet: ", mannschaftsnamen[j - 1])
print("\n")
print(line_info(), "Tore Heimmannschaft: ", tore_a)
print(line_info(), "Tore Auswärtsmannschaft: ", tore_b)
spielergebnis = [tore_a, tore_b]
print(line_info(), "Spielergebnis: ", spielergebnis[0], ":", spielergebnis[1])
print("\n")
spieldaten = [kennzahlenpaarung, paarung, spielergebnis]
print(line_info(), "Spieldaten: ", spieldaten)
spieledaten.append(spieldaten)
print(line_info(), "Spieledaten: ", spieledaten)
print("\n")
with open("Spieledaten.txt", "w", encoding="utf-8") as output:
for spieldaten in spieledaten:
output.write(f"{spieldaten}\n")
# Aufaddieren beginnt
print(line_info(), "Aufaddieren beginnt")
print("\n")
print(line_info(), "tore_i ", tore_i)
tore_i = tore_i + tore_a
print(line_info(), "tore_a", tore_a)
print(line_info(), "tore_i ", tore_i)
print("\n")
gegentore_i = + tore_b
tore_j = + tore_b
gegentore_j = gegentore_j + tore_a
anzahl_spiele_i = anzahl_spiele_i + 1
anzahl_spiele_j = anzahl_spiele_j + 1
tordifferenz_i = tore_i - gegentore_i
tordifferenz_j = tore_j - gegentore_j
if tore_a > tore_b:
spiele_gewonnen_i = spiele_gewonnen_i + 1
punkte_i = punkte_i + 3
spiele_verloren_j = spiele_verloren_j + 1
elif tore_a == tore_b:
spiele_remis_i = spiele_remis_i + 1
punkte_i = punkte_i + 1
spiele_remis_j = spiele_remis_j + 1
punkte_j = punkte_j + 1
else:
spiele_verloren_i = spiele_verloren_i + 1
spiele_gewonnen_j = spiele_gewonnen_j + 1
punkte_j = punkte_j + 3
tabellenzeile = (
mannschaftsnamen[i - 1],
anzahl_spiele_i, spiele_gewonnen_i, spiele_remis_i, spiele_verloren_i,
tore_i, gegentore_i, tordifferenz_i,
punkte_i
)
print(line_info(), "tabellenzeile: ", tabellenzeile)
print("\n")
tabelle.append(tabellenzeile)
tabellenzeile = (
mannschaftsnamen[j - 1],
anzahl_spiele_j, spiele_gewonnen_j, spiele_remis_j, spiele_verloren_j,
tore_j, gegentore_j, tordifferenz_j,
punkte_j
)
print(line_info(), "tabellenzeile: ", tabellenzeile)
print("\n")
tabelle.append(tabellenzeile)
print(line_info(), "tabelle : ", tabelle)
print("\n")
with open("tabelle.txt", "w", encoding="utf-8") as output:
for tabellenzeile in tabelle:
output.write(f"{tabellenzeile}\n")
print(line_info(), "tabelle = ", tabelle)
print("\n")
variablennullsetzung()
print("c = ", c)
print("\n")
e = 0
print("\n")
if c == b - 1:
with open("tabelle.txt", encoding="utf-8") as lines:
for line in lines:
tabelle.append(line.rstrip())
print(line_info(), "tabelle:", tabelle)
print("\n")
arr = np.zeros((mannschaftsanzahl, 12), dtype=object)
print(line_info())
print(arr)
print("\n")
for tabellenzeile in tabelle:
print(line_info(), "tabellenzeile = ", tabellenzeile)
e = e + 1
print(line_info(), "e = ", e)
print(line_info(), "lfd_nr", lfd_nr)
print("\n")
arr[e - 1, 0] = lfd_nr
arr[e - 1, 3] = tabellenzeile[0]
print(line_info(), "arr[e - 1, 3]: ", arr[e - 1, 3])
print(line_info(), "tabellenzeile[0]: ", tabellenzeile[0])
arr[e - 1, 4] = tabellenzeile[1]
anzahl_spiele = arr[e - 1, 4]
print(line_info(), "arr[e - 1, 4]: ", arr[e - 1, 4])
print(line_info(), "tabellenzeile[1]: ", tabellenzeile[1])
arr[e - 1, 5] = tabellenzeile[2]
spiele_gewonnen = arr[e - 1, 5]
arr[e - 1, 6] = tabellenzeile[3]
spiele_remis = arr[e - 1, 6]
arr[e - 1, 7] = tabellenzeile[4]
spiele_verloren = arr[e - 1, 7]
arr[e - 1, 8] = tabellenzeile[5]
tore = arr[e - 1, 8]
arr[e - 1, 9] = tabellenzeile[6]
gegentore = arr[e - 1, 9]
arr[e - 1, 10] = tabellenzeile[7]
tordifferenz = arr[e - 1, 10]
arr[e - 1, 11] = tabellenzeile[8]
punkte = arr[e - 1, 11]
if e == mannschaftsanzahl:
break
print(line_info(), "Hier ist man vor der Ausgabe des Arrays")
print(arr)
print("\n")
for e in range(0, mannschaftsanzahl):
print("e= ", e)
dtype = \
[
("lfd_nr[e]", np.str_, 4), ("mannschaftsname[e]", np.str_, 20),
("anzahl_spiele[e]", np.str_, 4), ("spiele_gewonnen[e]", np.str_, 4), ("spiele_remis[e]", np.str_, 4),
("spiele_verloren[e]", np.str_, 4), ("tore[e]", np.str_, 4), ("gegentore[e]", np.str_, 4),
("tordifferenz[e]", np.str_, 4), ("punkte[e]", np.str_, 4)
]
print(line_info(), "dtype: ", dtype)
print("\n")
for e in range(0, mannschaftsanzahl):
print("e= ", e)
values = \
[
("lfd_nr[e]", np.str_, 4), ("mannschaftsname[e]", np.str_, 20),
("anzahl_spiele[e]", np.str_, 4), ("spiele_gewonnen[e]", np.str_, 4), ("spiele_remis[e]", np.str_, 4),
("spiele_verloren[e]", np.str_, 4), ("tore[e]", np.str_, 4), ("gegentore[e]", np.str_, 4),
("tordifferenz[e]", np.str_, 4), ("punkte[e]", np.str_, 4)
]
print(line_info(), "01 values IN DER SCHLEIFE: ", values)
print("\n")
print(line_info(), "01 values AUSSERHALB DER SCHLEIFE: ", values)
print("\n")
print(line_info(), "Ur-arr: ", arr)
print("\n")
""" var = arr[arr[:, 8].argsort()][::-1]
print(var)
print("\n")
var1 = var[var[:, 10].argsort()][::-1]
print(var1)
print("\n")
varend = var1[var1[:, 11].argsort()][::-1]
print(varend) """
# np.argsort(a, axis=None, kind=None, order=None)[source]
# varend1 = np.argsort(arr, axis=(-1))
# varend2=np.sort(arr, order=["tore", "tordifferenz", "punkte"])
# print(varend2)
# arr.sort(order=["b", "a"])
# my_data = np.genfromtxt(infile, dtype=None, names=["a", "b", "c", "d"])
# ind = np.argsort(arr)
""" var = arr[arr[:, 8].lexsort()][::-1]
print(var)
print("\n")
var1 = var[var[:, 10].lexsort()][::-1]
print(var1)
print("\n")
varend3 = var1[var1[:, 11].lexsort()][::-1]
print(varend3) """
"""ind = np.argsort(arr)
print(ind) """
var = arr[arr[:, (8, 10, 11)].sort()]
print(line_info(), "var: ")
print(var)
# vas = arr[arr[:, ]]
""" vat = arr.sort(order=[
print(vat) """
# vau = np.genfromtxt( arr, dtype=object, names=(tore, tordifferenz, punkte) )
my_data = np.genfromtxt(arr, dtype=[('a', "int"), ('b', 'int'), ('c', int)])
Code: Alles auswählen
print(line_info(), "Ur-arr: ", arr)
Nach dieser Zeile muss das Array sortiert werden. Hier muss nach drei Spalten sortiert werden: Tore, Tordifferenz und Punkte. Nicht nacheinander sondern "verbunden". Gibt es hierfür einen Fachbegriff?
Das bekomme ich leider nicht hin, wie ihr an den folgenden Code-Zeilen sehen könnt.
Ich würde mich sehr freuen, wenn mir jemand weiterhelfen könnte.
Viele Grüße