Verschachtelte Listen - Länge vergleichen / Kürzeste auswählen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Natrium
User
Beiträge: 15
Registriert: Montag 13. April 2020, 16:13

Guten Tag zusammen,

Ich habe ein kleines Problem - und zwar soll mein Programm aus einer verschachtelten Liste die kürzeste Liste auswählen und dann den Inhalt ausgeben.

Die Länge der verschachtelten Liste ist variabel und könnte folgend aussehen:

Code: Alles auswählen

[['A', 'B', 'C'], ['D', 'E']]
oder
[['A', 'B', 'E'], ['A', 'E','F','G'],['H','I','J','K','L']]
Ausgabe sollte dann z.B. bei Nummer 1)

Code: Alles auswählen

['D', 'E']
und bei Nummer 2)

Code: Alles auswählen

['A', 'B', 'E']
sein.

Ich probiere mich jetzt schön länger mit range / len aber bin zu keinem sinnvollen Ergebnis gekommen.

Danke schon mal für Hilfe & einen angenehmen Osterabend noch :)
Greetz
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

Und was hast Du probiert?
Eigentlich ist das mit min und key=len ein Einzeiler.
Wenn Du aber selbst mit einer for-Schleife das kürzeste Element suchen willst, dann brauchst Du eine for-Schleife über die Elemente der Liste, und kein range.
Du mußt Dir halt immer das aktuell kürzeste Element in einer Variable merken.
Benutzeravatar
snafu
User
Beiträge: 6867
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Natrium hat geschrieben: Montag 13. April 2020, 16:25 Ich probiere mich jetzt schön länger mit range / len aber bin zu keinem sinnvollen Ergebnis gekommen.
Mit range() gehts auch, wäre aber der umständlichere Weg und ist auch nicht so gern gesehen. Der Zugriff mittels

Code: Alles auswählen

objekte[i]
wurde in vielen Programmiersprachen durch den moderneren foreach-Zugriff ersetzt oder zumindest als Alternative angeboten. Das sollte man dann auch in Python beherzigen, z.B. indem man ein Grundlagen-Tutorial liest. So erfährt man recht einfach, wie eine for-Schleife in Python geschrieben wird (Kapitel 4.2 in meinem Link). Und ansonsten könntest du auch einfach mal Code von dir zeigen, da kann man besser helfen als mit allgemeinen Aussagen. :)
Natrium
User
Beiträge: 15
Registriert: Montag 13. April 2020, 16:13

Vielen Dank euch schonmal für die Antworten :)

Ich war jetzt soweit, dass ich den Output bekomme, wie lang die einzelnen Listen sind, durch:

Code: Alles auswählen

def kurz_liste(liste):
	for reihe in liste:
		print(len(reihe))
Damit bekomme ich dann jedenfalls bereits raus, wie lang die einzelnen Listen sind. Allerdings tue ich mich jetzt ein wenig schwer beim Vergleich der Liste & der Ausgabe der kürzesten dann.
Lg :)

Edit - Sorry meinte natürlich len(reihe) - Man vergebe mir, habs tatsächlich aus dem Kopf gemacht gerade.
Zuletzt geändert von Natrium am Montag 13. April 2020, 17:22, insgesamt 1-mal geändert.
Benutzeravatar
snafu
User
Beiträge: 6867
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Erstmal heißt es natürlich len(reihe) und nicht (len)reihe. Da vermute ich mal, dass du als Anfänger noch nicht die Übung hast, das aus dem Kopf richtig aufzuschreiben. Und zur Frage: Naja, was hindert dich daran, dir die kleinste Länge zu merken und in den Schleifendurchläufen diese Länge mit der bisher kleinsten Länge zu vergleichen? Tipp: Dazu brauchst du eine Verzweigung (if-Anweisung), weil die alte kleinste Länge ja überschrieben werden muss, wenn die aktuelle Länge kleiner ist.

Als Startwert kannst du eine Zahl nehmen, die extra groß gewählt ist (100, 1000, was auch immer). Ich weiß ja nicht, was euer Lehrer da erwartet. Um ganz sicher zu sein, ginge auch float("inf"), was für Unendlich steht. Den muss man natürlich vor der Schleife festlegen.
Zuletzt geändert von snafu am Montag 13. April 2020, 17:28, insgesamt 1-mal geändert.
Benutzeravatar
__blackjack__
User
Beiträge: 14052
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Natrium: Damit bekommst Du gar nichts heraus, ausser einen Synax-Fehler aus dem Compiler:

Code: Alles auswählen

In [499]: def kurz_liste(liste): 
     ...:         for reihe in liste: 
     ...:                 print((len)reihe) 
     ...:                                                                       
  File "<ipython-input-499-3cabd82fc0f5>", line 3
    print((len)reihe)
                   ^
SyntaxError: invalid syntax
Wenn danach gefragt wird was Du versucht hast, dann bitte tatsächlich auch zeigen was Du versucht hast, und nicht irgend etwas ähnliches.

Die einfachste Lösung wurde bereits genanng: die `min()`-Funktion mit entsprechendem `key`-Argument.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Natrium
User
Beiträge: 15
Registriert: Montag 13. April 2020, 16:13

Alles klaro - danke für den Input, ich versuche mich weiter dran, das hat auf jeden Fall schon geholfen.

Thanks!
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Die min-Funktion hat ein key-Argument. Wenn du das auf len setzt, dann solltest du schon fertig sein.
Benutzeravatar
snafu
User
Beiträge: 6867
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Wurde jetzt schon mehrfach drauf hingewiesen und bestimmt auch wahrgenommen. Möglicherweise ist das aber eine Schulaufgabe und man soll es selber schreiben.

In einer Welt ohne min() würde es auch so gehen:

Code: Alles auswählen

from functools import reduce

items = [['A', 'B', 'E'], ['A', 'E','F','G'], ['X'], ['H','I','J','K','L']]
smallest = reduce(lambda a, b: a if len(a) < len(b) else b, items)
print(smallest)
Natrium
User
Beiträge: 15
Registriert: Montag 13. April 2020, 16:13

Code: Alles auswählen

def kurz_liste(liste):
    print(min(liste, key=len))
Alles klar - das ist ja mehr als simpel. Aber man lernt ja immer dazu )

Vielen Dank für die Unterstützung allerseits, die Min-Funktion war mir bis dato nicht bekannt.
lg
Antworten