web-dev-qa-db-fra.com

Python string.join (liste) sur un tableau d'objets plutôt que sur un tableau de chaînes

En Python, je peux faire:

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

Y at-il un moyen facile de faire la même chose quand j'ai une liste d'objets?

>>> 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

Ou dois-je recourir à une boucle for?

241
Mat

Vous pouvez utiliser une compréhension de liste ou une expression génératrice à la place:

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

Le constructeur de chaîne intégré appellera automatiquement obj.__str__:

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

une autre solution consiste à remplacer l'opérateur de jointure de la classe str. 

Définissons une nouvelle classe my_string comme suit 

class my_string(str):
    def join(self, l):
        l_tmp = [str(x) for x in l]
        return super(my_string, self).join(l_tmp)

Alors tu peux faire

class Obj:
    def __str__(self):
        return 'name'

list = [Obj(), Obj(), Obj()]
comma = my_string(',')

print comma.join(list)

et vous obtenez

name,name,name

BTW, en utilisant list comme nom de variable, vous redéfinissez la classe list (mot-clé)! Utilisez de préférence un autre nom d'identifiant.

J'espère que vous trouverez ma réponse utile. 

1
Nassim Seghir

Je sais que c’est un très vieux message, mais je pense que ce qui manque est de surcharger __repr__, de sorte que __repr__ = __str__, qui est la réponse acceptée de cette question marquée en double .

0
NotAnAmbiTurner