แปลงรายการอักขระเป็นสตริง


คำตอบ:


585

ใช้joinวิธีการของสตริงว่างเพื่อรวมสตริงทั้งหมดเข้าด้วยกันกับสตริงว่างในระหว่างดังนี้:

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

1
ฉันจะเพิ่มช่องว่างระหว่างตัวละครได้อย่างไร ต่อไปที่จะทำโดยไม่ต้องทำซ้ำผ่านทุกสิ่ง?
clifgray

18
เพียงทำ' '.join(list)ช่องว่างระหว่างคำพูด
clifgray

สิ่งที่ดีเกี่ยวกับเรื่องนี้คือคุณสามารถใช้ '\ n'.join (a) หากคุณต้องการเขียนรายการลงใน txt ด้วยบรรทัดใหม่สำหรับแต่ละรายการ
Norfeldt

28
ชี้แจง: หมายถึง"".join(['a','b','c']) Join all elements of the array, separated by the string ""ในลักษณะเดียวกับที่จะสร้าง" hi ".join(["jim", "bob", "joe"]) "jim hi bob hi joe"
แจ็ค

39

ใช้งานได้กับหลายภาษายอดนิยมเช่น JavaScript และ Ruby ทำไมไม่ใช้ Python

>>> ['a', 'b', 'c'].join('')
Traceback (most recent call last):
   File "<stdin>", line 1, in <module>
AttributeError: 'list' object has no attribute 'join'

แปลกพอใน Python joinวิธีการอยู่ในstrชั้นเรียน:

# this is the Python way
"".join(['a','b','c','d'])

เหตุใดจึงjoinไม่มีวิธีในlistวัตถุเช่นใน JavaScript หรือภาษาสคริปต์ที่เป็นที่นิยมอื่น ๆ นี่เป็นตัวอย่างหนึ่งที่ชุมชนงูเหลือมคิด เนื่องจากการเข้าร่วมส่งคืนสตริงจึงควรอยู่ในคลาสสตริงไม่ใช่ในคลาสรายการดังนั้นstr.join(list)เมธอดจึงหมายถึง: รวมรายการเข้าไปในสตริงใหม่โดยใช้strเป็นตัวคั่น (ในกรณีนี้strคือสตริงว่าง)

อย่างใดฉันก็ต้องรักวิธีคิดนี้หลังจากที่ในขณะ ฉันสามารถบ่นได้หลายอย่างเกี่ยวกับการออกแบบ Python แต่ไม่เกี่ยวกับการเชื่อมโยงของมัน


1
เหตุผลหลักสำหรับการเข้าร่วมเป็นวิธีสตริงแทนที่จะเป็นรายการวิธีคือมันยอมรับใด ๆ iterableไม่ใช่แค่รายการ คุณสามารถใช้นิพจน์ตัวสร้างพจนานุกรมชุดมุมมองชนิดต่าง ๆ และอื่น ๆ ดังนั้นจึงมีความยืดหยุ่นมากกว่าการเข้าร่วมอาเรย์ในภาษาส่วนใหญ่
rosuav

ฉันเปรียบเทียบ Python string.join()กับคอลเล็กชันส่วนใหญ่ที่มีjoin()วิธีการในภาษาแบบไดนามิกมากมาย เกี่ยวกับ iterables ฉันเดาว่ามันไม่ใช่ปัญหาสำหรับภาษาดังกล่าวเพราะมันเป็นเรื่องง่าย (และชัดเจน) ในการใส่ iterable ในตัวสร้างคอลเลกชันและเชนในjoin()เมธอด
เปาโล Scardine

ใช่สมมติว่าพวกเขามีรายการที่ขี้เกียจ (สไตล์ Haskell) หรือคุณสบายใจที่จะรวมรายการไว้ในหน่วยความจำก่อนที่จะเริ่ม ประเด็นของฉันคือวิธีการทำงานของไพ ธ อนไม่ได้เป็นไปตามอำเภอใจ แต่ก็มีเหตุผลที่ดีมาก
rosuav

1
มันไม่ได้เป็นแบบสุ่ม แต่เป็นการตัดสินใจออกแบบเพื่อหลีกเลี่ยงมลภาวะเนมสเปซในทุกชั้น :-)
Paulo Scardine

เผง นอกจากนี้ไม่ใช่ทั้งหมดที่เป็นคลาสแม้แต่ - "iterable" เป็นโปรโตคอลไม่ใช่คลาส คุณสามารถกรองแผนที่เข้าร่วม ฯลฯ โดยใช้ iterable ใด ๆ
rosuav

15

หาก Python interpreter ของคุณเก่า (1.5.2 ตัวอย่างเช่นซึ่งพบได้ทั่วไปใน Linux รุ่นเก่าบางรุ่น) คุณอาจไม่join()สามารถใช้เป็นเมธอดบนวัตถุสตริงเก่าใด ๆ ได้และคุณจะต้องใช้โมดูลสตริงแทน ตัวอย่าง:

a = ['a', 'b', 'c', 'd']

try:
    b = ''.join(a)

except AttributeError:
    import string
    b = string.join(a, '')

สตริงจะเป็นb'abcd'


10

นี่อาจเป็นวิธีที่เร็วที่สุด:

>> from array import array
>> a = ['a','b','c','d']
>> array('B', map(ord,a)).tostring()
'abcd'

4
@ WinstonEnert ใช่เมื่อวานนี้ฉันกำลังเขียนโปรแกรมที่ต้องทำสิ่งนั้นและฉันเปรียบเทียบกับประสิทธิภาพของบรรทัดนี้ในโปรแกรมของฉันผลการทดสอบแสดงว่าเร็วขึ้นประมาณ 20% แล้ว''.join(['a','b','c'])
bigeagle

2
มาตรฐานของฉันแสดงให้เห็นว่าการเข้าร่วมจะเร็วขึ้น 7 เท่า pastebin.com/8nSc5Ek1 คุณคิดจะแบ่งปันเกณฑ์มาตรฐานของคุณหรือไม่
Winston Ewert

1
@WinstonEwert คุณพูดถูก ฉันได้พบเหตุผลนี้: ในโปรแกรมของฉันฉัน recv รายการ int จากเครือข่ายแล้วแปลงเป็นสตริงที่map(ord,a)ไม่จำเป็น map(chr,a)แต่ความต้องการเข้าร่วม นี่คือมาตรฐานของฉันpastebin.com/1sKFm8ma
bigeagle

15
การเพิ่มประสิทธิภาพก่อนวัยอันควร มันยากมากที่จะอ่านและเข้าใจสิ่งที่เกิดขึ้น หากผู้ใช้ไม่ต้องการประสิทธิภาพในการดำเนินการ''.join()ก็สามารถอ่านได้ง่ายขึ้น
Luiz Damim

5
ไม่เห็นด้วย - โปรแกรมเมอร์ต้องคำนึงถึงวิธีที่เร็วที่สุดสำหรับสิ่งต่าง ๆ การดำเนินการที่เรียบง่ายเพียงครั้งเดียวที่ใช้เวลานานขึ้นเล็กน้อยนั้นไม่ใช่เรื่องใหญ่อะไร อย่างไรก็ตามนี่เป็นวิธีการที่ทุกโปรแกรมเขียนจบลง bloating และใช้ทรัพยากรมากเกินไป เมื่อเราไม่ทำให้ตัวเองกลายเป็นคนที่ทำสิ่งต่าง ๆ ให้ได้มากที่สุดเราจะพบกับโลกที่เป็นเช่น .... อย่าง Windows Vista หรือ Upstart ใน Linux เป็นตัวอย่างที่ดีของทางลัดขนาดเล็กจำนวนมากที่นำไปสู่ 'บวมและลอย' เหมือนตายในน้ำ พวกเขาทั้งคู่ก็น่าเกลียดเหมือนกัน ทำไมไม่ใช้ STR () เข้าร่วม (ก) ซึ่งเป็น 100% ที่แสดงออก imfho .. .
osirisgothra

4

ฟังก์ชั่นลดยังใช้งานได้

import operator
h=['a','b','c','d']
reduce(operator.add, h)
'abcd'

1
มันบั๊กฉันเสมอว่าผู้ให้บริการไม่ใช่พลเมืองชั้นหนึ่งในสิทธิของตนเอง ในรูปแบบตัวอย่างเช่นจะเป็น (ลด + h)
Brian Minton

ในรูปแบบ(reduce + '' h)หรือ(apply + h)จะทำงาน แต่จากนั้นอีกครั้งใน Python ตัวดำเนินการเพิ่มใช้ตัวถูกดำเนินการ 2 ตัวดังนั้นจึงจำเป็นต้องลด มิฉะนั้นคุณสามารถทำได้operator.add(*h)เนื่องจากapplyเลิกใช้แล้วอย่างเป็นทางการใน Python เพื่อสนับสนุนไวยากรณ์ของการโทรเพิ่มเติม (aka en.wikipedia.org/wiki/Variadic_function )
Brian Minton เมื่อ

3

ถ้ารายการมีหมายเลขคุณสามารถใช้กับmap()join()

เช่น:

>>> arr = [3, 30, 34, 5, 9]
>>> ''.join(map(str, arr))
3303459

จริงๆแล้วมันเป็น pythonic มากกว่าที่จะใช้''.join([str(i) for i in arr])
user1767754

@ user1767754 เอาล่ะ Guido ชอบสไตล์นั้น แต่ไม่มีอะไรผิดปกติกับการใช้ฟังก์ชั่นแผนที่
itsbruce

2
h = ['a','b','c','d','e','f']
g = ''
for f in h:
    g = g + f

>>> g
'abcdef'

6
นี่จะค่อนข้างช้า การใช้งาน''.join(h)จะทำได้ดีกว่าวิธีการผนวกหนึ่งต่อหนึ่งของคุณ
Martijn Pieters

1
ใน 'the' python bible (นั่นคือ 1,400+ หน้าหนึ่ง) ในหลาย ๆ ที่มันบอกเราว่านี่เป็นสิ่งที่ผิดที่ต้องทำและควรหลีกเลี่ยงเมื่อเป็นไปได้ มันเป็นเครื่องหมายการค้าที่เห็นได้ชัดอย่างเจ็บปวดของผู้เริ่มต้นงูเหลือมที่ไม่รู้เรื่อง (ไม่ดูถูกฟังก์ชั่น ... ดี) มันอาจใช้งานได้ แต่คุณจะได้ยิน "อย่าทำแบบนี้" จากผู้ใช้ประมาณ 5,000 คน
osirisgothra

2

นอกจากวิธีstr.joinที่เป็นธรรมชาติที่สุดแล้วยังมีความเป็นไปได้ที่จะใช้io.StringIOและใช้ในทางที่ผิดwritelinesเพื่อเขียนองค์ประกอบทั้งหมดในครั้งเดียว:

import io

a = ['a','b','c','d']

out = io.StringIO()
out.writelines(a)
print(out.getvalue())

พิมพ์:

abcd

เมื่อใช้วิธีการนี้กับฟังก์ชั่นเครื่องกำเนิดไฟฟ้าหรือ iterable ซึ่งไม่ใช่tupleหรือ a listมันจะบันทึกการสร้างรายการชั่วคราวที่joinจะจัดสรรขนาดที่เหมาะสมได้ในครั้งเดียว (และรายการของสตริง 1 ตัวอักษรนั้นแพงมากสำหรับหน่วยความจำ )

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


0

คุณสามารถใช้operator.concat()สิ่งนี้:

>>> from operator import concat
>>> a = ['a', 'b', 'c', 'd']
>>> reduce(concat, a)
'abcd'

หากคุณใช้ Python 3 คุณจะต้องมีการต่อเติม:

>>> from functools import reduce

ตั้งแต่ builtin reduce()ถูกลบออกจากงูหลามที่ 3 functools.reduce()และตอนนี้อยู่ใน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.