Dize dizisi yerine nesne dizisinde Python string.join (liste)


291

Python'da şunları yapabilirim:

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

Nesnelerin bir listesi olduğunda aynı şeyi yapmanın kolay bir yolu var mı?

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

Yoksa bir for döngüsüne başvurmam gerekir mi?

Yanıtlar:


432

Bunun yerine bir liste kavrama veya bir üreteç ifadesi kullanabilirsiniz:

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

3
veya bir jeneratör ifadesi: ',' .join (listedeki x için str (x))
dF.

1
hangisinin daha hızlı olacağı hakkında bir fikrin var mı?
gozzilli

Deneylerim, liste kavrayışının küçük listelerde% 60 daha iyi olabileceğini söylüyor (deneme, üç nesne () listesinde 10 ^ 6 kez çalıştırıldı). Ancak, performansları büyük listelerde benzerdir (2. deneme, 10 ^ 7 nesne () listesinde bir kez çalıştırılır).
gozzilli

3
iyi bir% 30 hızlanma için (yukarıdaki jeneratör ifadesi üzerinde), sözde daha az okunabilir mapifade kullanılabilir (aşağıda).
K3 - rnc

2
Bu cevap nesnel olarak mapçözümden daha kötüdür .
PascalVKooten

96

Yerleşik dize oluşturucu otomatik olarak şunu arar obj.__str__:

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

1
map () listeyi değiştirmez, [listede o için str (o)] ile eşdeğerdir
dF.

11
+1: Harita iyi bir yaklaşımdır; "listeyi değiştirmek" doğru bir yorum değildir.
S.Lott

2
(başka) +1 .. harita daha az okunabilir değil, sadece harita fonksiyonunun ne yaptığını bilmeniz gerekiyor
lapax

1
@Michael Doğru değil. reducekaldırıldı, çünkü genellikle insanları tahmin etmeye bıraktı ve bu nedenle "pitonik" değildi. mapdiğer yandan bir sorun değildir.
PascalVKooten

1
(başka) +1: Perl dünyasından gelen bu evrendeki en yaygın şeydir: join ("sep", list) - ve listenin tüm öğeleri dize temsillerine dönüştürülür. Python'da gerçekten bir çözüm bulmakta zorlanıyordum.
Jason

2

başka bir çözüm str sınıfının birleştirme işlecini geçersiz kılmaktır.

Yeni bir my_string sınıfını aşağıdaki gibi tanımlayalım

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

Sonra yapabilirsin

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

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

print comma.join(list)

ve alırsın

name,name,name

BTW, listeyi değişken adı olarak kullanarak liste sınıfını (anahtar kelime) yeniden tanımlıyorsunuz! Tercihen başka bir tanımlayıcı adı kullanın.

Umarım cevabımı faydalı bulursun.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.