Seite 1 von 1

Problem beim Sortieren eines Arrays

Verfasst: Freitag 16. Oktober 2020, 20:18
von Bill987654321
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.

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)])


Bis zu Zeile

Code: Alles auswählen

print(line_info(), "Ur-arr: ", arr)
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

Re: Problem beim Sortieren eines Arrays

Verfasst: Freitag 16. Oktober 2020, 20:44
von __blackjack__
@Bill987654321: Ob das funktioniert oder nicht ist eigentlich egal denn das ist so wie es da steht kein Python-Programm. Aber das hatten wir ja schon mal, dass man nicht mehr wie in BASIC in den 80ern programmiert. Selbst in BASIC nicht mehr. Wenn Du Python lernen möchtest und dabei Hilfe brauchst, gerne, aber dann bitte auch für Python-Programme und nicht für verkleidete BASIC-Programme.

Numpy wird ebenfalls missbraucht. Das ist nicht dazu da um sich so etwas wie FIELD aus GW-BASIC nachzubasteln.