2011-11-30 16 views
6

È possibile dividere una stringa e assegnare alcune parole ad una tupla in Python. esÈ possibile dividere e assegnare una stringa in una singola istruzione in Python?

a = "Jack and Jill went up the hill" 
    (user1 , user2) = a.split().pick(1,3) #picks 1 and 3 element in the list. 

È un tale rivestimento possibile? Se sì, qual è la sintassi.

+0

Intendi dire che devi mantenere la variabile 'a' dopo la divisione? – BoltClock

+1

hmm, tutti sembrano darti soluzioni per gli elementi 0 e 2 invece di 1 e 3. Solo un'osservazione divertente :) –

+0

Non intendo mantenere la variabile. – sheki

risposta

13

Se si desidera ottenere fantasia, è possibile utilizzare operator.itemgetter:

restituire un oggetto chiamabile che recupera elemento dal proprio operando con il metodo del operando __getitem__(). Se sono specificati più articoli, restituisce una tupla di valori di ricerca.

Esempio:

>>> from operator import itemgetter 
>>> pick = itemgetter(0, 2) 
>>> pick("Jack and Jill went up the hill".split()) 
('Jack', 'Jill') 

O come un one-liner (w/o l'importazione):

>>> user1, user2 = itemgetter(0, 2)("Jack and Jill went up the hill".split()) 
+0

Bello (e mi ha insegnato qualcosa che non sapevo anch'io)! Tuttavia, con la dichiarazione di importazione non è un one-liner ... ma due! ;) – mac

1

Il primo che mi viene in mente è:

>>> a = "Jack and Jill went up the hill" 
>>> [e for n, e in enumerate(a.split()) if n in (0, 2)] 
['Jack', 'Jill'] 

Nel caso in cui si chiedono: enumerate genera tuple con un numero progressivo, come primo elemento e un elemento del iterabile enumerati come secondo.

EDIT: Come detto nei commenti da parte @kindall, il passo finale sarebbe:

>>> user1, user2 = [e for n, e in enumerate(a.split()) if n in (0, 2)] 
>>> user1 
'Jack' 
>>> user2 
'Jill' 

ma ho scelto di non fare l'assegnazione solo per mantenere l'esempio più al punto (scusate se questo ha confuso qualcuno).

+0

Questa è una lista di comprensione. Lui vuole una tupla. (Suppongo che questo possa essere risolto con un cast semplice, però ...) – BoltClock

+2

Per collegare i punti per il richiedente: 'user1, user2 = (e per n, e in enumerate (a.split()) if n in (0, 2)) '(No, non ha richiesto una tupla, l'assegnazione multipla funziona con qualsiasi sequenza, anche con un'espressione di generatore.) – kindall

6

si può fare qualcosa di simile

a = "Jack and Jill went up the hill" 
user1, _, user2, _ = a.split(" ", 3) 

dove _ significa che non ci importa del valore, e split(" ", 3) dividere la stringa in 4 segmenti.

+1

Ingenius ... Non scala bene se si desidera solo il 1024esimo elemento in la tua lista però! ;) – mac

2

preferirei farlo in due linee, ma qui è una battuta:

user1, user2 = [token for (i, token) in enumerate(a.split()) if i in (0, 2)]

Ecco quello che vorrei fare, invece (solo per leggibilità e meno possibilità di introdurre bug, se ha bisogno di essere cambiato in futuro).

tokens = a.split() 
user1 = tokens[0] 
user2 = tokens[2] 
+0

Questa è sostanzialmente la mia risposta ... 2 minuti dopo il mio post. :( – mac

+0

Perché il cipiglio? Hai vinto la gara :) –

2

affettare supporta un parametro passo

a = "Jack and Jill went up the hill" 
(user1 , user2) = a.split()[0:4:2] #picks 1 and 3 element in the list 

ma mentre è possibile scrivere oneliner funky in Python per certo che non è la lingua migliore per th per tipo di esercizio.

+0

Funziona solo se gli elementi da raccogliere sono a intervalli regolari, non è vero? – mac

+3

Se tutti quelli che vogliono sono 2 eletti, saranno a "intervalli regolari" :-) – jsbueno

1

Questo fa il trucco:

user1, user2 = a.split()[0::2][:2]

Prelievo i primi due elementi della sequenza di conteggio da 2 a 2.

Problemi correlati