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?
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
Le constructeur de chaîne intégré appellera automatiquement obj.__str__
:
''.join(map(str,list))
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.
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 .