Apa sebenarnya yang dilakukan metode .join ()?

209

Saya cukup baru untuk Python dan saya benar-benar bingung dengan .join()yang saya baca adalah metode yang disukai untuk merangkai string.

Saya mencoba:

strid = repr(595)
print array.array('c', random.sample(string.ascii_letters, 20 - len(strid)))
    .tostring().join(strid)

dan mendapat sesuatu seperti:

5wlfgALGbXOahekxSs9wlfgALGbXOahekxSs5

Mengapa ini bekerja seperti ini? Bukankah seharusnya 595hanya ditambahkan secara otomatis?

Matt McCormick
sumber
1
Saya pikir Anda mengetuk Yubikey Anda saat program sedang berjalan
Trenton

Jawaban:

303

Perhatikan baik-baik output Anda:

5wlfgALGbXOahekxSs9wlfgALGbXOahekxSs5
^                 ^                 ^

Saya telah menyoroti "5", "9", "5" dari string asli Anda. join()Metode Python adalah metode string, dan mengambil daftar hal-hal untuk bergabung dengan string. Contoh sederhana dapat membantu menjelaskan:

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

"," Dimasukkan di antara setiap elemen dari daftar yang diberikan. Dalam kasus Anda, "daftar" Anda adalah representasi string "595", yang diperlakukan sebagai daftar ["5", "9", "5"].

Tampaknya Anda mencari yang +sebaliknya:

print array.array('c', random.sample(string.ascii_letters, 20 - len(strid)))
.tostring() + strid
Greg Hewgill
sumber
1
Mengapa tidak: 5wlfgALGbXOahekxSs9wlfgALGbXOahekxSs5wlfgALGbXOahekxSs? Dengan string yang ditambahkan ke elemen terakhir?
Matt McCormick
10
Salah satu alasannya adalah ini memberikan joinproperti yang berguna sebagai kebalikan dari split( docs.python.org/library/stdtypes.html#str.split )
cobbal
4
Jika Anda ingin pembatas lain, letakkan string kosong di akhir daftar Anda. ','.join(['a', 'b', 'c', ''])memberikan "a, b, c,"
tgray
9
OP mungkin bingung string.joindengan os.path.joinjalur mana yang memang berada
Juan Campa
91

joinmengambil hal yang dapat diubah sebagai argumen. Biasanya daftar. Masalah dalam kasus Anda adalah bahwa string itu sendiri dapat diubah, memberikan masing-masing karakter secara bergantian. Kode Anda rusak menjadi ini:

"wlfgALGbXOahekxSs".join("595")

yang bertindak sama seperti ini:

"wlfgALGbXOahekxSs".join(["5", "9", "5"])

dan menghasilkan string Anda:

"5wlfgALGbXOahekxSs9wlfgALGbXOahekxSs5"

String sebagai iterables adalah salah satu masalah awal yang paling membingungkan dengan Python.

Ned Batchelder
sumber
8
memilih untuk menunjukkan apa yang mungkin menjadi inti dari kebingungan: string dapat diubah sehingga mereka bertindak seperti daftar karakter.
Daniel Baird
59

Untuk menambahkan string, cukup menyatukannya dengan +tanda.

Misalnya

>>> a = "Hello, "
>>> b = "world"
>>> str = a + b
>>> print str
Hello, world

joinmenghubungkan string bersama dengan pemisah. Pemisah adalah apa yang Anda tempatkan tepat sebelum join. Misalnya

>>> "-".join([a,b])
'Hello, -world'

Bergabung mengambil daftar string sebagai parameter.

Dan Loewenherz
sumber
5
Jawaban langsung dan ringkas semacam ini harus didukung oleh komunitas kami. @ Dan
DehengYe
7

join () adalah untuk menggabungkan semua elemen daftar. Untuk menggabungkan hanya dua string "+" akan lebih masuk akal:

strid = repr(595)
print array.array('c', random.sample(string.ascii_letters, 20 - len(strid)))
    .tostring() + strid
Pēteris Caune
sumber
4

Untuk sedikit lebih memperluas apa yang orang lain katakan, jika Anda ingin menggunakan gabungan untuk hanya menggabungkan dua string Anda, Anda akan melakukan ini:

strid = repr(595)
print ''.join([array.array('c', random.sample(string.ascii_letters, 20 - len(strid)))
    .tostring(), strid])
Jorenko
sumber
2

Ada penjelasan yang bagus tentang mengapa mahal +untuk menggabungkan beberapa string di sini

Operator Plus adalah solusi yang sangat baik untuk menggabungkan dua string Python. Tetapi jika Anda terus menambahkan lebih dari dua string (n> 25), Anda mungkin ingin memikirkan hal lain.

''.join([a, b, c]) Trik adalah optimasi kinerja.

Zak
sumber
0

Untuk memberikan ini sebagai input,

li = ['server=mpilgrim', 'uid=sa', 'database=master', 'pwd=secret']
s = ";".join(li)
print(s)

Python mengembalikan ini sebagai output:

'server=mpilgrim;uid=sa;database=master;pwd=secret'
Akash Kandpal
sumber
0
list = ["my", "name", "is", "kourosh"]   
" ".join(list)

Jika ini adalah input, menggunakan metode GABUNG, kita dapat menambahkan jarak antara kata-kata dan juga mengkonversi daftar ke string.

Ini adalah output Python

'my name is kourosh'
kourosh
sumber
0

"" .join dapat digunakan untuk menyalin string dalam daftar ke variabel

>>> myList = list("Hello World")
>>> myString = "".join(myList)
>>> print(myList)
['H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd']
>>> print(myString)
Hello World
Martin
sumber