it-swarm.com.de

Python string.join (list) für ein Objektarray und nicht ein Stringarray

In Python kann ich Folgendes tun:

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

Gibt es eine einfache Möglichkeit, das gleiche zu tun, wenn ich eine Liste von Objekten habe?

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

Oder muss ich auf eine for-Schleife zurückgreifen?

241
Mat

Sie können stattdessen ein Listenverständnis oder einen Generatorausdruck verwenden:

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

Der eingebaute String-Konstruktor ruft automatisch obj.__str__ auf:

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

eine andere Lösung besteht darin, den Join-Operator der str-Klasse zu überschreiben. 

Wir definieren eine neue Klasse my_string wie folgt 

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

Dann kannst du es tun

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

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

print comma.join(list)

und du bekommst

name,name,name

BTW, mit list als Variablenname definieren Sie die Listenklasse (Schlüsselwort) neu! Verwenden Sie vorzugsweise einen anderen Bezeichnernamen.

Ich hoffe, Sie finden meine Antwort nützlich. 

1
Nassim Seghir

Ich weiß, dass dies ein sehr alter Beitrag ist, aber ich denke, dass das, was übersehen wird, __repr__ überschreibt, so dass __repr__ = __str__, das ist die akzeptierte Antwort dieser Frage, die als Duplikat markiert ist.

0
NotAnAmbiTurner