2009-01-31 5 views
200

En Python, no puedo hacer:Python string.join (lista) en la tabla de objetos en lugar de matriz de cadenas

>>> list = ['a', 'b', 'c'] 
>>> ', '.join(list) 
'a, b, c' 

¿Hay alguna forma fácil de hacer lo mismo cuando tengo una lista de objetos?

>>> class Obj: 
...  def __str__(self): 
...   return 'name' 
... 
>>> list = [Obj(), Obj(), Obj()] 
>>> ', '.join(list) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: sequence item 0: expected string, instance found 

¿O tengo que recurrir a un bucle?

Respuesta

301

Se podría utilizar una lista por comprensión o una expresión generadora lugar:

', '.join([str(x) for x in list]) # list comprehension 
', '.join(str(x) for x in list) # generator expression 
+1

o una expresión generadora: '' .join (str (x) para x en la lista) –

+0

¿Alguna idea de cuál de ellos sería más rápido? – gozzilli

+0

Mis experimentos dicen que la comprensión de la lista uno puede ser un 60% más rápido en listas pequeñas (experimento ejecutado 10^6 veces en una lista de tres objetos() s). Sin embargo, su rendimiento es similar en listas grandes (el segundo experimento se ejecuta una vez en una lista de 10^7 objetos()). – gozzilli

63

El incorporada en el constructor de cadena llamará automáticamente a obj.__str__:

''.join(map(str,list)) 
+1

map() no cambia la lista, es equivalente a [str (o) para o en la lista] –

+9

+1: Map is a good enfoque; "cambiar la lista" no es un comentario preciso. –

+1

(otro) +1 .. el mapa no es menos legible, solo necesita saber lo que hace la función de mapa – lapax

Cuestiones relacionadas