Seite 1 von 1

newbe Frage

Verfasst: Freitag 18. Juni 2010, 12:58
von mikanoca
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

Re: newbe Frage

Verfasst: Freitag 18. Juni 2010, 13:26
von numerix

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

Re: newbe Frage

Verfasst: Freitag 18. Juni 2010, 13:31
von mikanoca
ziemlich cool :!:

Danke!

Re: newbe Frage

Verfasst: Freitag 18. Juni 2010, 14:06
von 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')

Re: newbe Frage

Verfasst: Freitag 18. Juni 2010, 14:09
von sma

Code: Alles auswählen

sum(map(len, [liste1, liste2, liste3]) != 1
Stefan

Re: newbe Frage

Verfasst: Freitag 18. Juni 2010, 14:30
von numerix
@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.

Re: newbe Frage

Verfasst: Freitag 18. Juni 2010, 16:01
von mikanoca
@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 )

Re: newbe Frage

Verfasst: Freitag 18. Juni 2010, 16:13
von numerix
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.

Re: newbe Frage

Verfasst: Freitag 18. Juni 2010, 16:18
von Hyperion
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:

Re: newbe Frage

Verfasst: Freitag 18. Juni 2010, 16:20
von Hyperion
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

Re: newbe Frage

Verfasst: Freitag 18. Juni 2010, 17:11
von numerix
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 ... :)

Re: newbe Frage

Verfasst: Samstag 19. Juni 2010, 11:02
von sma
numerix hat geschrieben:Warum nicht einfach die Problemstellung an die Lösung anpassen ... :)
Das finde ich gut. Eine gute und bewährte Methode :)

Stefan

Re: newbe Frage

Verfasst: Samstag 19. Juni 2010, 13:08
von bords0
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.

Re: newbe Frage

Verfasst: Samstag 19. Juni 2010, 13:15
von Hyperion
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 :-)

Re: newbe Frage

Verfasst: Samstag 19. Juni 2010, 13:38
von cofi
Und deshalb ist es trotzdem eine Generator Expression (dort steht in der Language Reference uebrigens praktisch das gleiche)

Re: newbe Frage

Verfasst: Samstag 19. Juni 2010, 13:57
von numerix
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.

Re: newbe Frage

Verfasst: Samstag 19. Juni 2010, 14:06
von Hyperion
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?

Re: newbe Frage

Verfasst: Samstag 19. Juni 2010, 14:41
von cofi
Hyperion hat geschrieben:Inwiefern widerspricht das jetzt meiner Interpretation?
Gar nicht. Hatte nur uebersehen, dass du nicht mit der LC angefangen hattest :roll:

Re: newbe Frage

Verfasst: Samstag 19. Juni 2010, 21:23
von bords0
@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.