2016-03-01 11 views
7

Czy jest jakiś sposób w Pythonie, aby zwrócić wiele list ze zrozumieniem?Powrót wiele list ze zrozumieniem w python

chcę zrobić coś do skutku:

x,y = [i,(-1*j) for (i,j) in enumerate(range(10))] 
# x = [0 .. 9] 
# y = [0 .. -9] 

to głupi przykład, ale jestem po prostu zastanawiasz się, czy to możliwe.

+0

Prawdopodobnie, ale nie mogę wymyślić praktyczny powód, dla którego chciałbyś. – IanAuld

+1

@IanAuld nie widzisz praktycznego powodu, dla którego chcesz oddzielić twoje x i y? (może do wykreślania w niektórych bibliotekach?) –

+0

Prawdopodobnie byłoby to bardziej czytelne i łatwiejsze do zrobienia, aby zrobić to osobno. Nie musisz kłaść wszystkiego na jednej linii. – IanAuld

Odpowiedz

2
x,y =zip(* [(i,(-1*j)) for (i,j) in enumerate(range(10))]) 

wystarczy rozpakować listę o

xy = [(1,2),(3,4),(5,6)] 
x,y = zip(*xy) 
# x = (1,3,5) 
# y = (2,4,6) 
+2

Typy zwrotów obu są krotkami, a nie listami – IanAuld

+1

da to krotki, nie listy, ale jest to właściwy pomysł. – wim

+1

Sortuj. Główna różnica jest zmienna! = Niezmienna. – IanAuld

1

można pominąć listowych:

>>> x,y=range(0,10), range(0,-10,-1) 
>>> x 
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
>>> y 
[0, -1, -2, -3, -4, -5, -6, -7, -8, -9] 

Albo można zrobić:

>>> x,y=map(list, zip(*[(e,-e) for e in range(10)])) 
+0

Uwaga: 'range' zwraca tylko' list' na Py2; na Py3, jest to specjalny obiekt 'range', który musiałby być zawinięty w konstruktorze' list', aby utworzyć faktyczną, zmienną listę '. Ale tak, jeśli problem jest tak prosty, jak podany, najlepiej unikać złożoności generowania sparowanych wartości i sparowania ich, gdy łatwiej jest generować niesparowane wartości bezpośrednio. A jeśli zmienność nie jest potrzebna, użycie surowego Py3 'range' byłoby często lepsze niż zmienna' lista' (Py2 'xrange' nie jest tak dobra jak zamiana drop-in, nawet jeśli nie potrzebujesz mutability). – ShadowRanger

Powiązane problemy