2016-07-08 54 views
19

C'è un modo semplice/pulito per decomprimere una tupla Python sul lato destro da sinistra a destra?Disimballare una tupla Python da sinistra a destra?

Per esempio per

j = 1,2,3,4,5,6,7 

(1,2,3,4,5,6,7) 

v,b,n = j[4:7] 

Posso modificare la notazione fetta in modo che v = j[6], b=j[5], n=j[4]?

Mi rendo conto che posso semplicemente ordinare il lato sinistro per ottenere l'elemento desiderato, ma potrebbero esserci dei casi in cui vorrei solo decomprimere la tupla da sinistra a destra, penso.

+4

Perché dovresti non solo riordinare il lato sinistro? – user2357112

+2

Se si desidera invertire sequenze arbitrarie per l'assegnazione, 'v, b, n = invertito (my_values)' farà. Ad esempio, un 'collections.deque' non può essere annullato dalla notazione di slice. – MisterMiyagi

+0

Puoi semplicemente invertire la lista e tagliarla di conseguenza –

risposta

14

Nel caso in cui si desidera mantenere gli indici originali (cioè non vogliono perdere tempo con la modifica 4 e 7 a 6 e 3) si può anche utilizzare:

v, b, n = (j[4:7][::-1]) 
+0

Funziona anche grazie per il vostro aiuto. L'indice dell'ultimo elemento con valore 7 è [6] e nel tuo intervallo da [4] compreso a [7] non incluso.Nella risposta di Mosè penso che sia simile ma varia da [6] incluso fino a [3] non incluso. Quindi sembra che entrambi accedano agli stessi indici e penso che la soluzione fornita da Mosses sia un po 'più pulita. Grazie –

50

Questo dovrebbe fare:

v,b,n = j[6:3:-1] 

Un valore di incremento di -1 a partire da 6

+0

Grazie mille per averlo fatto. Ho provato lo stesso, ma come un principiante assoluto aveva provato [3: 6: -1] non capendo l'indice di stop iniziale necessario per essere invertito pure –

+0

@AnthonyLeeMeier Puoi anche dare un'occhiata a questo thread su [SO] (http: //stackoverflow.com/questions/509211/explain-pythons-slice-notation) –

+1

Penso che forse 'v, b, n = j [: - 4: -1]' è migliore, poiché è agnostico sulla lunghezza di ' j'. – Paul

10
n,b,v=j[4:7] 

funziona anche. Si può solo cambiare l'ordine oi valori sfusi restituiti

+7

* Mi rendo conto che posso semplicemente ordinare il lato sinistro per ottenere l'elemento desiderato * –

8

Si potrebbe ignorare il primo dopo l'inversione e utilizzare extended iterable unpacking:

j = 1, 2, 3, 4, 5, 6, 7 


_, v, b, n, *_ = reversed(j) 

print(v, b, n) 

che darebbe:

6 5 4 

O se si vuole ottieni elementi arbitrari che potresti utilizzare operator.itemgetter:

j = 1, 2, 3, 4, 5, 6, 7 

from operator import itemgetter 


def unpack(it, *args): 
    return itemgetter(*args)(it) 

v,b,n = unpack(j, -2,-3,-4) 

print(v, b, n) 

Il vantaggio di itemgetter è che funzionerà su qualsiasi iterabile e gli elementi non devono essere consecutivi.

+3

Bene, puoi anche fare 'v, b, n = invertito (j [4: 7])' senza usare l'estrazione estesa. questo ha il vantaggio che se 'j' è lungo 10 milioni di elementi, l'interprete non deve creare una nuova lista contenente tutti gli altri elementi. – Bakuriu

0

si può provare questo,

-1 significa guardare da inverso, con l'ultimo terzo elemento da ultimo elemento

>>> v,b,n=j[-1:-4:-1] 
>>> print 'v=',v,'b=',b,'n=',n 
v= 7 b= 6 n= 5 
>>>