Jawaban:
Gunakan join
metode string kosong untuk menggabungkan semua string bersama-sama dengan string kosong di antaranya, seperti:
>>> a = ['a', 'b', 'c', 'd']
>>> ''.join(a)
'abcd'
' '.join(list)
dengan spasi di antara tanda kutip
"".join(['a','b','c'])
berarti Join all elements of the array, separated by the string ""
. Dengan cara yang sama, " hi ".join(["jim", "bob", "joe"])
akan dibuat "jim hi bob hi joe"
.
Ini berfungsi dalam banyak bahasa populer seperti JavaScript dan Ruby, mengapa tidak menggunakan Python?
>>> ['a', 'b', 'c'].join('')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'list' object has no attribute 'join'
Cukup aneh, dengan Python join
metode ini ada di str
kelas:
# this is the Python way
"".join(['a','b','c','d'])
Mengapa join
bukan metode pada list
objek seperti pada JavaScript atau bahasa skrip populer lainnya? Ini adalah salah satu contoh bagaimana komunitas Python berpikir. Karena bergabung adalah mengembalikan string, itu harus ditempatkan di kelas string, bukan pada kelas daftar, jadi str.join(list)
metode ini berarti: bergabung dengan daftar ke string baru menggunakan str
sebagai pemisah (dalam hal ini str
adalah string kosong).
Entah bagaimana saya harus menyukai cara berpikir ini setelah beberapa saat. Saya bisa mengeluh tentang banyak hal dalam desain Python, tetapi tidak tentang koherensinya.
string.join()
dengan kebanyakan koleksi yang memiliki join()
metode dalam banyak bahasa dinamis. Tentang iterables, saya kira itu bukan masalah untuk bahasa seperti itu karena itu mudah (dan dapat dibaca) untuk menyertakan iterable dalam koleksi konstruktor dan rantai dalam join()
metode ini.
Jika juru bahasa Python Anda sudah tua (1.5.2, misalnya, yang umum pada beberapa distribusi Linux yang lebih lama), Anda mungkin tidak join()
tersedia sebagai metode pada objek string lama, dan Anda harus menggunakan modul string. Contoh:
a = ['a', 'b', 'c', 'd']
try:
b = ''.join(a)
except AttributeError:
import string
b = string.join(a, '')
String b
akan menjadi 'abcd'
.
Ini mungkin cara tercepat:
>> from array import array
>> a = ['a','b','c','d']
>> array('B', map(ord,a)).tostring()
'abcd'
''.join(['a','b','c'])
map(ord,a)
tidak perlu, tetapi bergabung dengan kebutuhan map(chr,a)
. Ini patokan pastebin.com/1sKFm8ma
''.join()
jauh lebih mudah dibaca.
Fungsi pengurangan juga berfungsi
import operator
h=['a','b','c','d']
reduce(operator.add, h)
'abcd'
(reduce + '' h)
atau (apply + h)
akan berhasil. Tetapi sekali lagi, dalam Python, operator add mengambil tepat 2 operan, maka kebutuhan untuk mengurangi. Jika tidak, Anda dapat melakukannya operator.add(*h)
, karena apply
telah secara resmi ditinggalkan dalam Python untuk sintaks panggilan yang diperpanjang (alias en.wikipedia.org/wiki/Variadic_function )
Jika daftar berisi nomor, Anda dapat menggunakan map()
dengan join()
.
Misalnya:
>>> 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)
akan jauh melampaui metode penambahan satu-per-satu Anda.
selain itu str.join
yang merupakan cara paling alami, kemungkinannya adalah menggunakan io.StringIO
dan menyalahgunakan writelines
untuk menulis semua elemen sekaligus:
import io
a = ['a','b','c','d']
out = io.StringIO()
out.writelines(a)
print(out.getvalue())
cetakan:
abcd
Ketika menggunakan pendekatan ini dengan fungsi generator atau iterable yang bukan a tuple
atau a list
, itu menyimpan pembuatan daftar sementara yang join
tidak mengalokasikan ukuran yang tepat dalam sekali jalan (dan daftar string 1 karakter sangat mahal dari segi memori ).
Jika Anda kekurangan memori dan Anda memiliki objek yang dievaluasi malas sebagai input, pendekatan ini adalah solusi terbaik.
Anda juga bisa menggunakan operator.concat()
seperti ini:
>>> from operator import concat
>>> a = ['a', 'b', 'c', 'd']
>>> reduce(concat, a)
'abcd'
Jika Anda menggunakan Python 3, Anda harus menambahkan:
>>> from functools import reduce
sejak builtin reduce()
telah dihapus dari Python 3 dan sekarang tinggal di functools.reduce()
.