2015-06-09 7 views
8

Ho una lista di dimensione incerta:Estrarre lista in mezzo a una tupla

l = [...] 

E voglio decomprimere questa lista in una tupla che ha altri valori, ma il seguito non riesce:

t = ("AA", "B", *l, "C") 

Come si forma quanto segue?

t = ("AA", "B", l[0], ..., l[:-1], "C") 

EDIT: sarebbe anche bello fare una fetta [a: b] solo:

t = ("AA", "B", l[a], ..., l[b], "C") 

risposta

1

Come di python 3.5, è ora possibile utilizzare il primo approccio:

>>> l = [1, 2, 3] 
>>> t = ("AA", "B", *l, "C") 
>>> t 
('AA', 'B', 1, 2, 3, 'C') 

È possibile utilizzare le fette proprio come ci si aspetterebbe:

>>> ("AA", "B", *l[:-1], "C") 
('AA', 'B', 1, 2, 'C') 

Il PEP correlate, per riferimento: PEP448

8

Non si può decomprimere in una tupla sostituendo valori come quello (ancora - vedi PEP 448), perché la decompressione avverrà solo nell'espressione sul lato sinistro o come dice il messaggio di errore, target di assegnazione.

Inoltre, l'obiettivo di assegnazione deve avere variabili Python valide. Nel tuo caso hai stringhe letterali anche nella tupla.

Ma si può costruire la tupla che volevi, concatenando tre tuple, come questo

>>> l = [1, 2, 3, 4] 
>>> ("A", "B") + tuple(l[:-1]) + ("C",) 
('A', 'B', 1, 2, 3, 'C') 
>>> ("A", "B") + tuple(l) + ("C",) 
('A', 'B', 1, 2, 3, 4, 'C') 
+0

questo funziona come previsto, grazie, anche se penso che la notazione * dovrebbe essere supportata come zucchero perché t il suo è brutto. Credo di poter scrivere una funzione che lo faccia. – Tommy

0

È possibile flatten the list e poi convertire in tupla.

>>> import itertools 
>>> l=[1,2,3,4] 
>>> t = ('A', 'B', l, 'C') 
>>> t 
('A', 'B', [1, 2, 3, 4], 'C') 
>>> tuple(itertools.chain.from_iterable(t)) 
('A', 'B', 1, 2, 3, 4, 'C') 
>>> 
+0

questo non funziona quando l'elenco contiene più caratteri come "abc". – Tommy

+0

Giusto. Questo è il comportamento corretto. Elenco e stringa sono entrambi iterabili. Quindi, anche la stringa viene espansa, simile alla lista. Colpa mia. – shantanoo