วิธีการ. join () ทำหน้าที่อะไร?


209

ฉันค่อนข้างใหม่กับ Python และสับสนอย่างสมบูรณ์โดย.join()ที่ฉันได้อ่านเป็นวิธีที่ต้องการสำหรับการต่อสตริง

ฉันเหนื่อย:

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

และได้รับสิ่งที่ชอบ:

5wlfgALGbXOahekxSs9wlfgALGbXOahekxSs5

ทำไมมันจึงเป็นเช่นนี้ ไม่ควร595ผนวกเข้าด้วยกันโดยอัตโนมัติหรือ


1
ฉันคิดว่าคุณเคาะ Yubikey ของคุณในขณะที่โปรแกรมกำลังทำงานอยู่
เทรนตัน

คำตอบ:


303

ดูที่ผลลัพธ์ของคุณอย่างระมัดระวัง:

5wlfgALGbXOahekxSs9wlfgALGbXOahekxSs5
^                 ^                 ^

ฉันได้เน้น "5", "9", "5" ของสตริงเดิมของคุณ join()วิธีPython เป็นวิธีสตริงและรับรายการสิ่งต่าง ๆ เพื่อเข้าร่วมกับสตริง ตัวอย่างที่ง่ายกว่าอาจช่วยอธิบาย:

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

"," ถูกแทรกระหว่างแต่ละองค์ประกอบของรายการที่กำหนด ในกรณีของคุณ "list" ของคุณคือการแสดงสตริง "595" ซึ่งถือว่าเป็นรายการ ["5", "9", "5"]

ดูเหมือนว่าคุณกำลังมองหา+แทน:

print array.array('c', random.sample(string.ascii_letters, 20 - len(strid)))
.tostring() + strid

1
ทำไมมันไม่: 5wlfgALGbXOahekxSs9wlfgALGbXOahekxSs5wlfgALGbXOahekxSs ด้วยสตริงที่ผนวกเข้ากับองค์ประกอบสุดท้าย?
Matt McCormick

10
เหตุผลหนึ่งก็คือนี้จะช่วยให้joinมีประโยชน์คุณสมบัติของการเป็นผกผันของsplit( docs.python.org/library/stdtypes.html#str.split )
cobbal

4
หากคุณต้องการตัวคั่นอื่นให้ใส่สตริงว่างที่ท้ายรายการของคุณ ','.join(['a', 'b', 'c', ''])ให้ "a, b, c,"
tgray

9
OP อาจสับสนstring.joinกับการos.path.joinที่เส้นทางเชื่อมต่อกันอย่างแน่นอน
Juan Campa

91

joinใช้สิ่งที่ iterable เป็นอาร์กิวเมนต์ มักจะเป็นรายการ ปัญหาในกรณีของคุณคือสตริงตัวเอง iterable ให้ออกอักขระแต่ละตัวในทางกลับกัน รหัสของคุณแบ่งเป็น:

"wlfgALGbXOahekxSs".join("595")

ซึ่งทำหน้าที่เช่นนี้:

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

และผลิตสตริงของคุณ:

"5wlfgALGbXOahekxSs9wlfgALGbXOahekxSs5"

เงื่อนไขการใช้ซ้ำเป็นหนึ่งในปัญหาการเริ่มต้นที่สับสนมากที่สุดกับ Python


8
upvote สำหรับการชี้ให้เห็นสิ่งที่อาจเป็นจุดเริ่มต้นของความสับสน: สตริงเป็น iterable ดังนั้นพวกเขาทำหน้าที่เหมือนรายการของตัวอักษร
Daniel Baird

59

ในการต่อท้ายสตริงให้ต่อข้อมูลเข้ากับ+เครื่องหมาย

เช่น

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

joinเชื่อมต่อสตริงพร้อมกับตัวคั่น joinคั่นคือสิ่งที่คุณวางขวาก่อน เช่น

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

เข้าร่วมใช้รายการของสตริงเป็นพารามิเตอร์


5
ชุมชนของเราควรได้รับคำตอบโดยตรงและกระชับ @Dan
DehengYe

7

เข้าร่วม () คือการเชื่อมต่อองค์ประกอบรายการทั้งหมด สำหรับการต่อข้อมูลสองสาย "+" จะเหมาะสมกว่า:

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

4

หากต้องการขยายเพิ่มเติมอีกเล็กน้อยเกี่ยวกับสิ่งที่ผู้อื่นพูดถ้าคุณต้องการใช้การเข้าร่วมเพื่อเชื่อมโยงสองสายเข้าด้วยกันคุณต้องทำดังนี้

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

2

มีคำอธิบายที่ดีว่าทำไมจึงมีค่าใช้จ่ายสูงในการ+เชื่อมสตริงจำนวนมากที่นี่

ผู้ประกอบการบวกเป็นทางออกที่ดีอย่างสมบูรณ์แบบเพื่อเชื่อมโยงสองสายงูหลาม แต่ถ้าคุณเพิ่มมากกว่าสองสาย (n> 25) ต่อไปคุณอาจต้องการคิดอย่างอื่น

''.join([a, b, c]) เคล็ดลับคือการเพิ่มประสิทธิภาพ


0

ในการให้สิ่งนี้เป็นอินพุต

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

Python คืนค่านี้เป็น output:

'server=mpilgrim;uid=sa;database=master;pwd=secret'

0
list = ["my", "name", "is", "kourosh"]   
" ".join(list)

หากนี่คืออินพุตโดยใช้วิธีเข้าร่วมเราสามารถเพิ่มระยะห่างระหว่างคำและแปลงรายการเป็นสตริง

นี่คือผลลัพธ์ของ Python

'my name is kourosh'

0

"" .joinอาจถูกใช้เพื่อคัดลอกสตริงในรายการไปยังตัวแปร

>>> myList = list("Hello World")
>>> myString = "".join(myList)
>>> print(myList)
['H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd']
>>> print(myString)
Hello World
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.