2016-07-01 4 views
3

Manchmal habe ich mehrere Achsen in axes[0], und manchmal nur eine. So iterieren es/sie, verwende ich folgendes:Wie wiederhole ich, wenn Sie nicht wissen, ob Ihr Objekt iterierbar sein wird

for ax,_x in [(axes[0], X[0])] if len(X)==1 else zip(axes[0],X):

Was ist der idiomatische Weg, dies zu tun?

+0

https://docs.python.org/3/glossary.html#term-eafp – jonrsharpe

+0

'hasattr (Achsen [0] "__iter __")' oder 'try/except', vielleicht? – jDo

+2

Sie müssen die Länge nicht überprüfen, verwenden Sie einfach 'zip (Achsen [0], X)'. Aber wenn Sie die Spalten erstellen möchten, wenn Sie die Länge der Iterables nicht kennen, verwenden Sie am besten 'itertools.zip_longest()' (wenn Sie alle Elemente länger iterierbar halten möchten), verwenden Sie andernfalls 'zip '. – Kasramvd

Antwort

0

Im Allgemeinen ist der beste Weg, nur zu iterieren. Don't ask for permission (mit if Kontrollen, sondern wickeln Sie es in einem try-except Block die „Vergebung“ Fälle für den Umgang.

Wie andere allerdings bemerkt haben, sollten Sie nicht verschiedene Fälle erstellen, wenn X eine Liste der Größe ist 1, die noch ist . iterable Wenn Sie zip verwenden wird es bei der kürzesten iterable stoppen:

>>> l = [1, 2, 3]  
>>> y = [1, 2] 

>>> list(zip(l, y)) 
[(1, 1), (2, 2)] 

Wenn Sie mit allen Werten der längeren iterable arbeiten müssen und bieten Standardwerte für die fehlenden Werte der kurzgeschlossenen ein, verwenden zip_longest von itertools mit eine geeignete fillvalue:

>>> from itertools import zip_longest 

>>> list(zip_longest(l, y, fillvalue=0)) 
[(1, 1), (2, 2), (3, 0)] 
Verwandte Themen