suche in verschachtelter Liste

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
Phiene
User
Beiträge: 12
Registriert: Freitag 25. November 2022, 14:07

Hallo Zusammen,

ich will aus einer verschachtelten Liste das größte Element raus suchen, dazu ist aber nicht die Anzahl der Listen die in der Liste sind gegeben, also brauche ich ein "variadic argument".

Code: Alles auswählen

def f(*liste):
    MAX = ''
    for item in liste:
        if item > MAX:
            MAX = item
    return MAX

liste = [['a','ab'],['Hallo'],['a','b'],['abc','cba','cad']]
print(f(liste))
es kommt dann immer die Fehlermeldung:

TypeError: '>' not supported between instances of 'list' and 'str'

kann mir dabei einer Helfen?
Benutzeravatar
sparrow
User
Beiträge: 4197
Registriert: Freitag 17. April 2009, 10:28

In einer Liste mit homogenen Elementen würde man so nicht suchen. Dafür kennt Python die max Funktion.

Was wäre denn das von dir erwartete Ergebnis?

Vielleicht möchtest du dir itertools.chain.from_iterable anschauen.
Phiene
User
Beiträge: 12
Registriert: Freitag 25. November 2022, 14:07

sparrow hat geschrieben: Sonntag 11. Dezember 2022, 20:14 In einer Liste mit homogenen Elementen würde man so nicht suchen. Dafür kennt Python die max Funktion.

Was wäre denn das von dir erwartete Ergebnis?
also ich soll in dem Algorithmus nicht die Max Funktion nutzen :?

die Ausgabe müsste dann 'cba' sein

ich vermute dass ich eine zweite for Schleife einbringen muss die dann die einzelnen unterlisten abruft, aber sicher bin ich mir nicht weil die versuche auch schon gescheitert sind....
Benutzeravatar
sparrow
User
Beiträge: 4197
Registriert: Freitag 17. April 2009, 10:28

Wenn du keine Hilfen nutzen darfst (wäre ein tolle Info im ersten Post gewesen): Du weißt ja, wie man über Elemente iterierst. Dann schau doch mal, was item so ist. Eher nicht, was der Name suggeriert.
Phiene
User
Beiträge: 12
Registriert: Freitag 25. November 2022, 14:07

also item ist in dem Fall eine unterliste von der eigentliche liste
Benutzeravatar
sparrow
User
Beiträge: 4197
Registriert: Freitag 17. April 2009, 10:28

Du hast eine liste mit dem Namen "liste".
Und deren Elemente sind Listen.

Wenn du weißt, wie man über die Elemente einer Liste iteriert - warum machst du das nicht für "item" (was ein eher nicht so guter Name für das ist, was es ist)?
Phiene
User
Beiträge: 12
Registriert: Freitag 25. November 2022, 14:07

meinst du eine zweite For Schleife einfügen?
ich komm einfach nicht drauf sitze da schon seit Stunden dran...
Benutzeravatar
__blackjack__
User
Beiträge: 13121
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Phiene: Das ``*`` in der Funktionssignatur gehört da nicht hin und Du brauchst kein „variadic argument“.

Und dann benutze die `max()`-Funktion. Wenn das funktioniert, schreibst Du einfach Deine eigene `max()`-Funktion. So lernst Du wie man das in der Praxis mit der `max()`-Funktion macht und verstösst nicht gegen die Randbedingungen der Aufgabe.

`itertools.chain.from_iterable()` ist dann auch nicht erlaubt? Was ist mit `map()`? Generatorausdruck? „List comprehension“?
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Phiene
User
Beiträge: 12
Registriert: Freitag 25. November 2022, 14:07

Code: Alles auswählen

def f(liste):
    MAX = ''
    i = 0
    for item in liste:
        item = liste[i]
        i = 1 + i
        for it in item:
            if it > MAX:
                MAX = it
    return MAX

liste = [['a','ab'],['Hallo'],['a','b'],['abc','cba','cad']]
print(f(liste))
Benutzeravatar
sparrow
User
Beiträge: 4197
Registriert: Freitag 17. April 2009, 10:28

Was soll denn jetzt das unsinnige i da und warum überschreibst du item in der Schleife mit dem Objekt, das es eh schon ist?
Ich weiß, meine Aussagen sind manchmal zu subtil, aber: Deine Namensgebung wird immer schlechter.

Warum ist MAX komplett groß geschrieben? Das kennzeichnet in Python per Konvention Konstanten. Und das ist keine Konstante.
Benutzeravatar
__blackjack__
User
Beiträge: 13121
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Phiene: Namen komplett in Grossbuchstaben sind Konstanten, `MAX` ist aber keine Konstante.

`i` macht keinen Sinn. Was denkst Du was `item` aus ``for item …`` ist? Das verwendest Du ja nirgends, weil Du `item` in der Schleife sofort an einen ”anderen” Wert bindest.

`item` ist immer noch ein etwas irreführender Name und `it` noch mehr, weil das eine kryptische Abkürzung ist. `it` ist letztlich ein einzelnes ”skalares” Element das man `item` nennen würde.

Die Funktion verhält sich IMHO etwas komisch wenn man eine leere Liste übergibt, oder eine Liste in der nur leere Listen enthalten sind. Soll wirklich das hier wirklich gelten:

Code: Alles auswählen

assert f([]) == f([[]]) == f([[""]])
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten