Seite 1 von 1

Zweidimensionale Liste / Rechnen

Verfasst: Mittwoch 10. Mai 2017, 18:36
von reddy
Hallo,
ich habe leider im Internet nichts passendes gefunden.
Es geht um das Rechnen mit Zwei(Mehr-)-Dimensionalen Listen.
Z.B. bei eindimensionaler Liste ist klar:

Code: Alles auswählen

import statistics
liste = [1.85, 1.90, 1.86, 1.69, 1.78, 1.79]
Durchschnitt = statistics.mean(liste)
print(round(Durchschnitt, 2))
Bei zweidimensionalen Liste ist es bei mir schwieriger. Um damit zu rechnen, mache ich zuerst wieder eindimensionale Liste daraus:

Code: Alles auswählen

liste = [["Alex", 1.85], ["Conrad", 1.90], ["Sven", 1.86], ["Peter", 1.69], ["Martin", 1.78], ["Frank", 1.79]]
liste_nur_groesse = []
for n in range(len(liste)):
    liste_nur_groesse.append(liste[n][1])

Durchschnitt = statistics.mean(liste_nur_groesse)
print(round(Durchschnitt, 2))
Gibt es eventuell eine einfachere Lösung?

Re: Zweidimensionale Liste / Rechnen

Verfasst: Mittwoch 10. Mai 2017, 18:45
von Sirius3
@reddy: in Python iteriert man nicht über einen Index, sondern über die Elemente der Liste direkt:

Code: Alles auswählen

liste = [["Alex", 1.85], ["Conrad", 1.90], ["Sven", 1.86], ["Peter", 1.69], ["Martin", 1.78], ["Frank", 1.79]]
liste_nur_groesse = []
for name, groesse in liste:
    liste_nur_groesse.append(groesse)
das kann man durch eine List-Comprehension kürzer schreiben:

Code: Alles auswählen

liste_nur_groesse = [groesse for name, groesse in liste]
oder direkt als Generatorausdruck für mean:

Code: Alles auswählen

durchschnitt = statistics.mean(groesse for name, groesse in liste)
print("{:.2f}".format(durchschnitt))

Re: Zweidimensionale Liste / Rechnen

Verfasst: Mittwoch 10. Mai 2017, 19:30
von BlackJack
Noch eine Variante mit `map()` und `operator.itemgetter()`:

Code: Alles auswählen

In [20]: liste
Out[20]: 
[['Alex', 1.85],
 ['Conrad', 1.9],
 ['Sven', 1.86],
 ['Peter', 1.69],
 ['Martin', 1.78],
 ['Frank', 1.79]]

In [21]: list(map(operator.itemgetter(1), liste))
Out[21]: [1.85, 1.9, 1.86, 1.69, 1.78, 1.79]

In [22]: statistics.mean(map(operator.itemgetter(1), liste))
Out[22]: 1.8116666666666668

Re: Zweidimensionale Liste / Rechnen

Verfasst: Donnerstag 11. Mai 2017, 11:33
von MagBen
Das Python-Modul Numpy hat multidimensionale Array-Klassen. Damit kannst Du sowohl auf Zeilen als auch auf Spalten von 2D-Arrays zugreifen. Operationen wie Mittelwert-Berechnung von einer Spalte werden damit zum Einzeiler.
Allerdings sollten alle Spalten den gleichen Datentyp haben.

Re: Zweidimensionale Liste / Rechnen

Verfasst: Donnerstag 11. Mai 2017, 11:59
von BlackJack
Man kann bei Numpy auch pro Spalte einen Datentyp angeben. Oder man setzt gleich auf Pandas und dessen `DataFrame`\s.

Numpy:

Code: Alles auswählen

In [16]: liste
Out[16]: 
[['Alex', 1.85],
 ['Conrad', 1.9],
 ['Sven', 1.86],
 ['Peter', 1.69],
 ['Martin', 1.78],
 ['Frank', 1.79]]

In [17]: A = np.array(map(tuple, liste), dtype=[('name', object), ('score', float)])

In [18]: A['score'].copy()
Out[18]: array([ 1.85,  1.9 ,  1.86,  1.69,  1.78,  1.79])

In [19]: A['score'].copy().mean()
Out[19]: 1.8116666666666668
Pandas:

Code: Alles auswählen

In [30]: df = pd.DataFrame(liste, columns=['name', 'score'])

In [31]: df
Out[31]: 
     name  score
0    Alex   1.85
1  Conrad   1.90
2    Sven   1.86
3   Peter   1.69
4  Martin   1.78
5   Frank   1.79

In [32]: df.score
Out[32]: 
0    1.85
1    1.90
2    1.86
3    1.69
4    1.78
5    1.79
Name: score, dtype: float64

In [33]: df.score.mean()
Out[33]: 1.8116666666666668

Re: Zweidimensionale Liste / Rechnen

Verfasst: Donnerstag 11. Mai 2017, 18:20
von reddy
Danke schön an alle!

Mit Pandas und Numpy werde ich mich später beschäftigen.
Es sind einfach mächtige Werkzeuge. Da muss man ja gar nichts mehr programmieren. :-)
operator.itemgetter() habe ich bis jetzt nur zum Sortieren von Listen benutzt. map() ist mir vollkommen unbekannt.

Von List-Comprehension höre ich immer wieder. Zur Zeit ist es interessanteste Lösung.
Ich hätte da noch eine Frage...:-)
Ich arbeite manchmal mit Tabellen, bei denen Datensätze unvollständig sind.
Kann man bei List-Comprehension auch logische Funktionen einsetzen?
Z.B. mein (schrecklicher) Code wäre dann:

Code: Alles auswählen

liste = [["Alex", 1.85], ["Conrad", 1.90], ["Sven", 1.86], ["Peter", 1.69], ["Martin", 1.78], ["Frank", 1.79],
         ["Mark", "kA"]]
# "kA" = keine Angabe
liste_nur_groesse = []
for n in range(len(liste)):
    if liste[n][1] == "kA":
        continue
    else:
        liste_nur_groesse.append(liste[n][1])

Durchschnitt = statistics.mean(liste_nur_groesse)
print(round(Durchschnitt, 2))
Wie kann man List-Comprehension nutzen und dabei fehlende Eingaben ignorieren?

Re: Zweidimensionale Liste / Rechnen

Verfasst: Donnerstag 11. Mai 2017, 18:40
von BlackJack
@reddy: Iii, unnötige Indexzugriffe und ``continue``. Dreh die Bedingung um und mach den ``else``-Zweig zum ``if``-Zweig, und der Indexzugriff geht ja mal gar nicht (ungetestet):

Code: Alles auswählen

liste_nur_groesse = list()
for _, height in liste:
    if height != 'kA':
        liste_nur_groesse.append(height)

# <->

liste_nur_groesse = [height for _, height in liste if height != 'kA']