2011-11-30 14 views
6

Se puede dividir una cadena y asignar algunas de las palabras a una tupla en Python. por ejemplo¿Es posible dividir y asignar una cadena en una sola instrucción en Python?

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

es un forro posible? Si es así, ¿cuál es la sintaxis?

+0

¿Quiere decir que necesita mantener la variable 'a' después de dividir? – BoltClock

+1

hmm, todo el mundo parece darte soluciones para los elementos 0 y 2 en lugar de 1 y 3. Solo una observación divertida :) –

+0

No me refiero a mantener la variable. – sheki

Respuesta

13

Si usted desea conseguir la suposición, se puede usar operator.itemgetter:

devolver un objeto invocable que obtiene elemento de su operando utilizando el método del operando __getitem__(). Si se especifican varios elementos, devuelve una tupla de valores de búsqueda.

Ejemplo:

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

o como una sola línea (w/o la importación):

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

¡Agradable (y me enseñó algo que yo tampoco sabía)! Aún así, con la declaración de importación no es un trazador de líneas ... ¡sino dos! ;) – mac

1

El primero que viene a la mente es:

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

En caso de que se preguntan: enumerate genera tuplas con un número progresivo como primer elemento y un elemento de la iterables enumerado como el segundo.

EDIT: Como se ha dicho en los comentarios por @kindall, el paso final sería:

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

pero optó por no hacer la tarea sólo para mantener el ejemplo más al punto (lo siento si esto confundió a alguien).

+0

Eso es una lista de comprensión. Él quiere una tupla. (Supongo que esto se puede abordar con un simple molde, aunque ...) – BoltClock

+2

Para conectar los puntos para el asker: 'user1, user2 = (e para n, e en enumerate (a.split()) if n in (0, 2)) '(No, él no pidió una tupla, la asignación múltiple funciona con cualquier secuencia, incluso una expresión del generador.) – kindall

6

Usted puede hacer algo como esto

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

donde _ significa que no nos importa del valor, y split(" ", 3) dividir la cadena en 4 segmentos.

+1

Ingenius ... No escala bien si solo quiere el 1024º elemento en tu lista sin embargo! ;) – mac

2

Prefiero hacer esto de dos líneas, pero aquí es una sola línea:

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

Esto es lo que yo haría en su lugar (sólo para la legibilidad y menos posibilidad de introducir errores si es necesario para ser cambiado en el futuro).

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

Esa es básicamente mi respuesta ... 2 minutos después de mi publicación. :( – mac

+0

¿Por qué frunces el ceño? Has ganado la carrera :) –

2

rebanar soporta un parámetro de paso

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

pero mientras es posible escribir en Oneliners funky en Python para asegurarse de que no es el mejor lenguaje para en clase de ejercicio.

+0

Esto solo funciona si los elementos para elegir son a intervalos regulares, ¿no? – mac

+3

Si todo lo que quiere son 2 elkements, estarán en un "intervalo regular" :-) – jsbueno

1

Esto hace el truco:

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

escoger los dos primeros elementos de la secuencia de conteo de 2 en 2.

Cuestiones relacionadas