append; Liste

Code-Stücke können hier veröffentlicht werden.
Antworten
Tombery
User
Beiträge: 2
Registriert: Mittwoch 10. Juli 2019, 19:56

Mittwoch 10. Juli 2019, 20:16

Hallöchen,
ich arbeite gerade an einem Projekt und muss mir hierfür ein bisschen Python beibringen.

Nehmen wir an ich habe folgende Liste P1=[20,20,20,20,20,12,4,5,6,3,3,2,4]
Nun will ich eine neue Liste erzeugen in der alle Maximalwerte, maximaloft vorkommen.
Eigentlich sollte das ja so funktionieren.

Code: Alles auswählen

k=0
while k <= P1.count(max(P1)):
    Aus=[max(P1)]
    Aus.append(Aus)
    k=k+1

leider schreibt er mir dann nur []

Wieso sollte Aus leer sein?
Bitte um Hilfe, es macht für mich keinen Sinn mehr.
Benutzeravatar
__blackjack__
User
Beiträge: 3522
Registriert: Samstag 2. Juni 2018, 10:21

Donnerstag 11. Juli 2019, 00:26

@Tombery: Für mich macht die Beschreibung „eine neue Liste erzeugen in der alle Maximalwerte, maximaloft vorkommen“ keinen Sinn. Es kann nur einen Maximalwert geben. Der Code mach auch keinen Sinn. Und das ist sicher nicht der Code den Du ausführst bei dem eine leere Liste ausgegeben wird, denn weder `P1` noch `Aus` (beides besch…eidene Namen) sind am Ende leer. Also was führst Du *tatsächlich* aus, und wie und was gibst Du am Ende aus, denn in dem gezeigten Code wird gar nichts ausgegeben.

Da sich die Obergrenze, auf die in der ``while``-Bedingung geprüft wird, nicht ändert, weil sich `P1` in der Schleife nicht ändert und sich damit auch die Ergebnisse von ``max(P1)`` und auch ``P1.count(max(P1))`` immer gleich bleiben, ist das keine ``while`` sondern eine ``for``-Schleife:

Code: Alles auswählen

for k in range(P1.count(max(P1)) + 1):
    Aus = [max(P1)]
    Aus.append(Aus)
Da `Aus` aber in jedem Schleifendurchlauf einen neuen Wert zugewiesen bekommt, der nicht vom alten Wert von `Aus` abhängig ist, macht die ganze Schleife überhaupt keinen Sinn. Das kann man auch ohne Schleife schreiben, ohne das sich am Ergebnis etwas ändert:

Code: Alles auswählen

Aus = [max(P1)]
Aus.append(Aus)
Das gibt genau das gleiche Ergebnis wie Deine fünf Zeilen Code mit der ``while``-Schleife. Nur das die im Verhältnis deutlich mehr Rechenzeit verbrät.

Kann es sein, dass Du so etwas hier suchst?

Code: Alles auswählen

#!/usr/bin/env python3


def main():
    values = [20, 20, 20, 20, 20, 12, 4, 5, 6, 3, 3, 2, 4]
    max_value = max(values)
    result = [value for value in values if value == max_value]
    print(result)


if __name__ == '__main__':
    main()
Oder Alternativ:

Code: Alles auswählen

#!/usr/bin/env python3


def main():
    values = [20, 20, 20, 20, 20, 12, 4, 5, 6, 3, 3, 2, 4]
    max_value = max(values)
    result = [max_value] * values.count(max_value)
    print(result)


if __name__ == '__main__':
    main()
Das ist wahrscheinlich etwas schneller, dafür hat man am Ende den selben Wert statt alle Werte mit dem gleichen Wert, die aber durchaus verschiedene Typen haben können. Kommt halt darauf an was man will/braucht.
A train station is where trains stop.
A bus station is where busses stop.
A Work Station is where …
Tombery
User
Beiträge: 2
Registriert: Mittwoch 10. Juli 2019, 19:56

Donnerstag 11. Juli 2019, 11:43

Danke für deine Antwort. Du hattest absolut recht mit deiner Annahme.

Code: Alles auswählen

 def main():
    values = [20, 20, 20, 20, 20, 12, 4, 5, 6, 3, 3, 2, 4]
    max_value = max(values)
    result = [value for value in values if value == max_value]
    print(result)


if __name__ == '__main__':
    main() 
Dieser Code funktioniert perfekt.

Dankeschön!
Antworten