2009-01-31 5 views
200

En Python, je peux le faire:Python string.join (liste) sur tableau d'objets plutôt que tableau de chaînes

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

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

Répondre

301

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

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

ou une expression du générateur: '' .join (str (x) pour x dans la liste) –

+0

une idée sur laquelle d'entre eux serait plus rapide? – gozzilli

+0

Mes expériences disent que la compréhension de la liste on peut être un bon 60% plus rapide sur les petites listes (expérience exécutée 10^6 fois sur une liste de trois objets). Cependant, leur performance est similaire sur les grandes listes (2ème expérience exécutée une fois sur une liste d'objets 10^7). – gozzilli

63

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

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

map() ne change pas la liste, c'est équivalent à [str (o) pour o dans la liste] –

+9

+1: Map is a good approche; "changer la liste" n'est pas un commentaire précis. –

+1

(un autre) +1 .. carte n'est pas moins lisible, il suffit de savoir ce que la fonction de carte fait – lapax

Questions connexes