string.join(lista) en una matriz de objetos en lugar de una matriz de cadenas
En Python, puedo hacer:
list = ['a', 'b', 'c']
', '.join(list) # 'a, b, c'
Sin embargo, si tengo una lista de objetos e intento hacer lo mismo:
class Obj:
def __str__(self):
return 'name'
list = [Obj(), Obj(), Obj()]
', '.join(list)
Obtuve el siguiente error:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: sequence item 0: expected string, instance found
¿Hay alguna manera fácil? ¿O tengo que recurrir a un bucle for?
En su lugar, podría utilizar una lista por comprensión o una expresión generadora:
', '.join([str(x) for x in list]) # list comprehension
', '.join(str(x) for x in list) # generator expression
El constructor de cadenas incorporado llamará automáticamente obj.__str__
:
''.join(map(str,list))
Sé que esta es una publicación muy antigua, pero creo que lo que se omite es primordial __repr__
, por lo que __repr__ = __str__
cuál es la respuesta aceptada de esta pregunta marcada como duplicada .
Otra solución es anular el operador de unión de la clase str.
Definamos una nueva clase my_string de la siguiente manera
class my_string(str):
def join(self, l):
l_tmp = [str(x) for x in l]
return super(my_string, self).join(l_tmp)
Entonces puedes hacer
class Obj:
def __str__(self):
return 'name'
list = [Obj(), Obj(), Obj()]
comma = my_string(',')
print comma.join(list)
y obtienes
name,name,name
Por cierto, al usar list como nombre de variable, ¡estás redefiniendo la clase de lista (palabra clave)! Preferiblemente utilice otro nombre de identificador.
Espero que encuentres útil mi respuesta.