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

3 minutos de lectura

En Python, puedo hacer:

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

¿Hay alguna manera 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 for?

En su lugar, podría usar una comprensión de lista o una expresión generadora:

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

  • o una expresión generadora: ‘, ‘.join(str(x) for x in list)

    – DF.

    31 de enero de 2009 a las 0:12

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

    – gozzili

    23 de marzo de 2012 a las 13:29

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

    – gozzili

    23 de marzo de 2012 a las 13:42


  • para una buena aceleración del 30% (sobre la expresión del generador anterior), uno puede usar el supuestamente menos legible map expresión (abajo).

    – K3—rnc

    3 de agosto de 2013 a las 15:49

  • Esta respuesta es objetivamente peor que la map solución.

    – Pascal V Kooten

    12/10/2015 a las 16:27

avatar de usuario
Bancos de Kenan

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

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

  • map() no cambia la lista, es equivalente a [str(o) for o in list]

    – DF.

    31 de enero de 2009 a las 0:26

  • +1: el mapa es un buen enfoque; “cambiar la lista” no es un comentario preciso.

    – S. Lott

    31 de enero de 2009 a las 2:32

  • (otro) +1 .. el mapa no es menos legible, solo necesita saber qué hace la función del mapa

    – lapax

    10 de abril de 2015 a las 8:20

  • @Michael No es correcto. reduce fue el que se eliminó, porque generalmente dejaba a la gente adivinando y, por lo tanto, no era “pitónico”. map por otro lado no es un problema.

    – Pascal V Kooten

    12/10/2015 a las 16:28

  • (otro) +1: viniendo del mundo de Perl, esto es lo más común en el universo: unirse (“sep”, lista) – y todos los elementos de la lista se convierten en sus representaciones de cadena. Realmente he estado luchando para encontrar una solución en python.

    – Jasón

    23 de febrero de 2018 a las 13:12

Sé que esta es una publicación muy antigua, pero creo que lo que se pierde es anular __repr__de modo que __repr__ = __str__que 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, usando lista ¡como nombre de variable, está redefiniendo la clase de lista (palabra clave)! Preferiblemente utilice otro nombre identificador.

Espero que encuentres útil mi respuesta.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad