string.join(lista) en una matriz de objetos en lugar de una matriz de cadenas

Resuelto Mat asked hace 15 años • 5 respuestas

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?

Mat avatar Jan 31 '09 07:01 Mat
Aceptado

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
Adam Rosenfield avatar Jan 31 '2009 00:01 Adam Rosenfield

El constructor de cadenas incorporado llamará automáticamente obj.__str__:

''.join(map(str,list))
Kenan Banks avatar Jan 31 '2009 00:01 Kenan Banks

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 .

NotAnAmbiTurner avatar Nov 21 '2018 04:11 NotAnAmbiTurner

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.

Nassim Seghir avatar Aug 15 '2018 11:08 Nassim Seghir