Yanıtlar:
Aradaki join
boş dizeyle birlikte tüm dizeleri birleştirmek için boş dizenin yöntemini kullanın, şöyle:
>>> a = ['a', 'b', 'c', 'd']
>>> ''.join(a)
'abcd'
' '.join(list)
tırnak işaretleri arasında bir boşluk yapın
"".join(['a','b','c'])
anlamına gelir Join all elements of the array, separated by the string ""
. Aynı şekilde, " hi ".join(["jim", "bob", "joe"])
yaratacaktır "jim hi bob hi joe"
.
Bu JavaScript ve Ruby gibi birçok popüler dilde çalışıyor, neden Python'da değil?
>>> ['a', 'b', 'c'].join('')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'list' object has no attribute 'join'
Python'da join
yöntem str
sınıfta yeterince garip :
# this is the Python way
"".join(['a','b','c','d'])
Nesnede neden JavaScript veya diğer popüler kod dillerinde olduğu gibi join
bir yöntem yok list
? Python topluluğunun nasıl düşündüğüne bir örnektir. Join bir dize döndürdüğünden, liste sınıfına değil, dize sınıfına yerleştirilmelidir, bu nedenle str.join(list)
yöntem şu anlama gelir: listeyi str
ayırıcı olarak kullanarak yeni bir dizeye birleştirir (bu durumda str
boş bir dizedir).
Her nasılsa bir süre sonra bu şekilde düşünmeyi sevmeliyim. Python tasarımında pek çok şeyden şikayet edebilirim, ancak tutarlılığı hakkında değil.
string.join()
bir join()
yöntemi olan çoğu koleksiyonla karşılaştırıyordum . Tekrarlanabilirler hakkında, sanırım bu diller için bir sorun değil, çünkü yöntemde bir toplama yapıcısına ve zincire yinelenebilirliği dahil etmek kolay (ve okunaklı) join()
.
Python yorumlayıcınız eskiyse (örneğin, bazı eski Linux dağıtımlarında yaygın olan 1.5.2), join()
herhangi bir eski dize nesnesinde yöntem olarak kullanılamayabilir ve bunun yerine dize modülünü kullanmanız gerekir. Misal:
a = ['a', 'b', 'c', 'd']
try:
b = ''.join(a)
except AttributeError:
import string
b = string.join(a, '')
Dize b
olacaktır 'abcd'
.
Bu en hızlı yol olabilir:
>> from array import array
>> a = ['a','b','c','d']
>> array('B', map(ord,a)).tostring()
'abcd'
''.join(['a','b','c'])
map(ord,a)
gereksiz yere dizeye dönüştürmek , ama ihtiyaçlarını katılmak map(chr,a)
. İşte benim karşılaştırmalı değerlendirme pastebin.com/1sKFm8ma
''.join()
bir çok daha okunabilir.
Azaltma işlevi de çalışır
import operator
h=['a','b','c','d']
reduce(operator.add, h)
'abcd'
(reduce + '' h)
ya (apply + h)
da işe yarayacaktı. Ama sonra tekrar, Python'da, ekleme operatörü tam olarak 2 işlenen alır, dolayısıyla azaltma ihtiyacı. Aksi takdirde, yapabilirsin operator.add(*h)
, çünkü apply
resmi olarak Python'da genişletilmiş çağrı sözdizimi lehine kullanımdan kaldırıldı (aka en.wikipedia.org/wiki/Variadic_function )
Liste numaralarını varsa, kullanabilirsiniz map()
ilejoin()
.
Örneğin:
>>> arr = [3, 30, 34, 5, 9]
>>> ''.join(map(str, arr))
3303459
''.join([str(i) for i in arr])
h = ['a','b','c','d','e','f']
g = ''
for f in h:
g = g + f
>>> g
'abcdef'
''.join(h)
, tek tek ekleme yönteminizden çok daha uzak olacaktır.
str.join
en doğal yolun yanı sıra , tüm öğeleri tek seferde yazmak için kullanmak io.StringIO
ve kötüye kullanmak writelines
:
import io
a = ['a','b','c','d']
out = io.StringIO()
out.writelines(a)
print(out.getvalue())
baskılar:
abcd
Bu yaklaşımı bir üreteç işleviyle veya a tuple
veya a olmayan bir yinelemeyle kullanırken list
, geçici liste oluşturmayı kaydeder.join
doğru boyutu ayırmak için (ve 1 karakterli dizelerin listesi bellek açısından çok pahalıdır ).
Belleğiniz yetersizse ve giriş olarak tembel olarak değerlendirilen bir nesneniz varsa, bu yaklaşım en iyi çözümdür.
Ayrıca şöyle kullanabilirsiniz operator.concat()
:
>>> from operator import concat
>>> a = ['a', 'b', 'c', 'd']
>>> reduce(concat, a)
'abcd'
Python 3'ü kullanmanız gerekiyorsa:
>>> from functools import reduce
yerleşik reduce()
Python 3 kaldırıldı ve şimdi yaşıyor functools.reduce()
.