newbe Frage

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
mikanoca
User
Beiträge: 26
Registriert: Dienstag 15. Juni 2010, 11:02

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
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

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
User
Beiträge: 26
Registriert: Dienstag 15. Juni 2010, 11:02

ziemlich cool :!:

Danke!
BlackJack

@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')
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Code: Alles auswählen

sum(map(len, [liste1, liste2, liste3]) != 1
Stefan
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

@BlackJack: (War natürlich nicht ernst gemeint - aber der OP wollte ja eine Fehlermeldung ...).
In deinem Beispiel müsste es aber all statt any heißen.

@sma: Das macht aber doch nicht das, was der OP wollte.
mikanoca
User
Beiträge: 26
Registriert: Dienstag 15. Juni 2010, 11:02

@numerix: Ich fand Deine Lösung nicht schlecht, es ist doch eigentlich nur

Code: Alles auswählen

if (len(a)>1 and len(b)>1 and len(c)>1):
print 'shit'
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 :D )
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

mikanoca hat geschrieben:all()/any() benutzt wohl immer die for-Schleife oder ?
Nein. Das dient nur der Ermittlung der Listenlängen. Nennt sich übrigens "list comprehension".

Tipp: Es gibt Python-Code-Tags hier im Forum.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

mikanoca hat geschrieben: Am schönsten finde ich die Lösung von sma (wenn sie denn funktionieren würde :D )
Ich will ja nicht philosophisch werden, aber kann denn etwas, das das Problem nicht löst, eine Lösung sein? :mrgreen:
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

mikanoca 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.
Nur mal so ganz naiv: Wozu hat man eigentlich 3 Listen von der Länge 0 oder 1? :K
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Hyperion hat geschrieben:
mikanoca hat geschrieben: Am schönsten finde ich die Lösung von sma (wenn sie denn funktionieren würde :D )
Ich will ja nicht philosophisch werden, aber kann denn etwas, das das Problem nicht löst, eine Lösung sein? :mrgreen:
Warum nicht einfach die Problemstellung an die Lösung anpassen ... :)
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

numerix hat geschrieben:Warum nicht einfach die Problemstellung an die Lösung anpassen ... :)
Das finde ich gut. Eine gute und bewährte Methode :)

Stefan
bords0
User
Beiträge: 234
Registriert: Mittwoch 4. Juli 2007, 20:40

numerix hat geschrieben:
mikanoca hat geschrieben:all()/any() benutzt wohl immer die for-Schleife oder ?
Nein. Das dient nur der Ermittlung der Listenlängen. Nennt sich übrigens "list comprehension".
Nein, eine LC ist wieder was anderes. Dass BlackJack die nicht verwendet hat, ist auch sinnvoll.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

bords0 hat geschrieben:
numerix hat geschrieben:
mikanoca hat geschrieben:all()/any() benutzt wohl immer die for-Schleife oder ?
Nein. Das dient nur der Ermittlung der Listenlängen. Nennt sich übrigens "list comprehension".
Nein, eine LC ist wieder was anderes. Dass BlackJack die nicht verwendet hat, ist auch sinnvoll.
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.
Der interessante Teil aus BJs Antwort ist der hier:

Code: Alles auswählen

len(xs) > 1 for xs in [a, b, c]
Für mich entspricht das der Def. oben :-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
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)
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

bords0 hat geschrieben:
numerix hat geschrieben:
mikanoca hat geschrieben:all()/any() benutzt wohl immer die for-Schleife oder ?
Nein. Das dient nur der Ermittlung der Listenlängen. Nennt sich übrigens "list comprehension".
Nein, eine LC ist wieder was anderes. Dass BlackJack die nicht verwendet hat, ist auch sinnvoll.
Ja, hast du Recht. Da hatte ich nur oberflächlich hingeguckt und den verwendeten Klammertyp nicht beachtet.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

cofi hat geschrieben:Und deshalb ist es trotzdem eine Generator Expression (dort steht in der Language Reference uebrigens praktisch das gleiche)
Inwiefern widerspricht das jetzt meiner Interpretation?
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Hyperion hat geschrieben:Inwiefern widerspricht das jetzt meiner Interpretation?
Gar nicht. Hatte nur uebersehen, dass du nicht mit der LC angefangen hattest :roll:
bords0
User
Beiträge: 234
Registriert: Mittwoch 4. Juli 2007, 20:40

@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.
Antworten