Hallo,
auch wenn einige schimpfen; ich habe in den Büchern und Tutorials nichts adäquates gefunden.
Mein Problem: Ich habe 3 Listen unterschiedlicher Länge. Wenn die Länge aller Listen, d.h. jeder einzelnen Liste, größer als 1 ist, möchte ich einen Fehler ausgeben.
Gibts da eine elegante Lösung (also keine mit irgendwelchen for-Schleifen ) ??
Vielen Dank !
mikanoca
newbe Frage
Code: Alles auswählen
>>> a,b,c = range(4),range(9),range(3)
>>> 1/(not (len(a)>1 and len(b)>1 and len(c)>1))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ZeroDivisionError: integer division or modulo by zero
@mikanoca: Die Antwort war sicher nicht ernst gemeint. So etwas sollte man nicht in Produktivcode verwenden.
Code: Alles auswählen
if any(len(xs) > 1 for xs in [a, b, c]):
raise Exception('spam')
Code: Alles auswählen
sum(map(len, [liste1, liste2, liste3]) != 1
@numerix: Ich fand Deine Lösung nicht schlecht, es ist doch eigentlich nur
oder eben mit try/except...
all()/any() benutzt wohl immer die for-Schleife oder ?
Am schönsten finde ich die Lösung von sma (wenn sie denn funktionieren würde
)
Code: Alles auswählen
if (len(a)>1 and len(b)>1 and len(c)>1):
print 'shit'
all()/any() benutzt wohl immer die for-Schleife oder ?
Am schönsten finde ich die Lösung von sma (wenn sie denn funktionieren würde

- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
Ich will ja nicht philosophisch werden, aber kann denn etwas, das das Problem nicht löst, eine Lösung sein?mikanoca hat geschrieben: Am schönsten finde ich die Lösung von sma (wenn sie denn funktionieren würde)

encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
assert encoding_kapiert
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
Nur mal so ganz naiv: Wozu hat man eigentlich 3 Listen von der Länge 0 oder 1? :Kmikanoca hat geschrieben: Mein Problem: Ich habe 3 Listen unterschiedlicher Länge. Wenn die Länge aller Listen, d.h. jeder einzelnen Liste, größer als 1 ist, möchte ich einen Fehler ausgeben.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
assert encoding_kapiert
Warum nicht einfach die Problemstellung an die Lösung anpassen ...Hyperion hat geschrieben:Ich will ja nicht philosophisch werden, aber kann denn etwas, das das Problem nicht löst, eine Lösung sein?mikanoca hat geschrieben: Am schönsten finde ich die Lösung von sma (wenn sie denn funktionieren würde)

Nein, eine LC ist wieder was anderes. Dass BlackJack die nicht verwendet hat, ist auch sinnvoll.numerix hat geschrieben:Nein. Das dient nur der Ermittlung der Listenlängen. Nennt sich übrigens "list comprehension".mikanoca hat geschrieben:all()/any() benutzt wohl immer die for-Schleife oder ?
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
bords0 hat geschrieben:Nein, eine LC ist wieder was anderes. Dass BlackJack die nicht verwendet hat, ist auch sinnvoll.numerix hat geschrieben:Nein. Das dient nur der Ermittlung der Listenlängen. Nennt sich übrigens "list comprehension".mikanoca hat geschrieben:all()/any() benutzt wohl immer die for-Schleife oder ?
Der interessante Teil aus BJs Antwort ist der hier:Python Doku hat geschrieben: Each list comprehension consists of an expression followed by a for clause, then zero or more for or if clauses. The result will be a list resulting from evaluating the expression in the context of the for and if clauses which follow it. If the expression would evaluate to a tuple, it must be parenthesized.
Code: Alles auswählen
len(xs) > 1 for xs in [a, b, c]

encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
assert encoding_kapiert
- cofi
- Python-Forum Veteran
- Beiträge: 4432
- Registriert: Sonntag 30. März 2008, 04:16
- Wohnort: RGFybXN0YWR0
Und deshalb ist es trotzdem eine Generator Expression (dort steht in der Language Reference uebrigens praktisch das gleiche)
Michael Markert ❖ PEP 8 Übersetzung ❖ Tutorial Übersetzung (3.x) ⇒ Online-Version (Python 3.3) ❖ Deutscher Python-Insider ❖ Projekte
Ja, hast du Recht. Da hatte ich nur oberflächlich hingeguckt und den verwendeten Klammertyp nicht beachtet.bords0 hat geschrieben:Nein, eine LC ist wieder was anderes. Dass BlackJack die nicht verwendet hat, ist auch sinnvoll.numerix hat geschrieben:Nein. Das dient nur der Ermittlung der Listenlängen. Nennt sich übrigens "list comprehension".mikanoca hat geschrieben:all()/any() benutzt wohl immer die for-Schleife oder ?
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
Inwiefern widerspricht das jetzt meiner Interpretation?cofi hat geschrieben:Und deshalb ist es trotzdem eine Generator Expression (dort steht in der Language Reference uebrigens praktisch das gleiche)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
assert encoding_kapiert
- cofi
- Python-Forum Veteran
- Beiträge: 4432
- Registriert: Sonntag 30. März 2008, 04:16
- Wohnort: RGFybXN0YWR0
Gar nicht. Hatte nur uebersehen, dass du nicht mit der LC angefangen hattestHyperion hat geschrieben:Inwiefern widerspricht das jetzt meiner Interpretation?

Michael Markert ❖ PEP 8 Übersetzung ❖ Tutorial Übersetzung (3.x) ⇒ Online-Version (Python 3.3) ❖ Deutscher Python-Insider ❖ Projekte
@Hyperion: Es ist sehr sinnvoll, hier keine LC sondern eine generator expression zu verwenden, weil der Ausdruck dann nur so oft ausgewertet wird, wie es nötig ist. Deshalb hatte ich drauf hingewiesen; ansonsten ist beides (an dieser Stelle!) fast identisch.