หากฉันมีรายการตัวอักษร:
a = ['a','b','c','d']
ฉันจะแปลงเป็นสตริงเดี่ยวได้อย่างไร
a = 'abcd'
หากฉันมีรายการตัวอักษร:
a = ['a','b','c','d']
ฉันจะแปลงเป็นสตริงเดี่ยวได้อย่างไร
a = 'abcd'
คำตอบ:
ใช้join
วิธีการของสตริงว่างเพื่อรวมสตริงทั้งหมดเข้าด้วยกันกับสตริงว่างในระหว่างดังนี้:
>>> a = ['a', 'b', 'c', 'd']
>>> ''.join(a)
'abcd'
' '.join(list)
ช่องว่างระหว่างคำพูด
"".join(['a','b','c'])
Join all elements of the array, separated by the string ""
ในลักษณะเดียวกับที่จะสร้าง" hi ".join(["jim", "bob", "joe"])
"jim hi bob hi joe"
ใช้งานได้กับหลายภาษายอดนิยมเช่น 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 แต่ไม่เกี่ยวกับการเชื่อมโยงของมัน
string.join()
กับคอลเล็กชันส่วนใหญ่ที่มีjoin()
วิธีการในภาษาแบบไดนามิกมากมาย เกี่ยวกับ iterables ฉันเดาว่ามันไม่ใช่ปัญหาสำหรับภาษาดังกล่าวเพราะมันเป็นเรื่องง่าย (และชัดเจน) ในการใส่ iterable ในตัวสร้างคอลเลกชันและเชนในjoin()
เมธอด
หาก 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'
นี่อาจเป็นวิธีที่เร็วที่สุด:
>> from array import array
>> a = ['a','b','c','d']
>> array('B', map(ord,a)).tostring()
'abcd'
''.join(['a','b','c'])
map(ord,a)
ไม่จำเป็น map(chr,a)
แต่ความต้องการเข้าร่วม นี่คือมาตรฐานของฉันpastebin.com/1sKFm8ma
''.join()
ก็สามารถอ่านได้ง่ายขึ้น
ฟังก์ชั่นลดยังใช้งานได้
import operator
h=['a','b','c','d']
reduce(operator.add, h)
'abcd'
(reduce + '' h)
หรือ(apply + h)
จะทำงาน แต่จากนั้นอีกครั้งใน Python ตัวดำเนินการเพิ่มใช้ตัวถูกดำเนินการ 2 ตัวดังนั้นจึงจำเป็นต้องลด มิฉะนั้นคุณสามารถทำได้operator.add(*h)
เนื่องจากapply
เลิกใช้แล้วอย่างเป็นทางการใน Python เพื่อสนับสนุนไวยากรณ์ของการโทรเพิ่มเติม (aka en.wikipedia.org/wiki/Variadic_function )
ถ้ารายการมีหมายเลขคุณสามารถใช้กับmap()
join()
เช่น:
>>> 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)
จะทำได้ดีกว่าวิธีการผนวกหนึ่งต่อหนึ่งของคุณ
นอกจากวิธี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 ตัวอักษรนั้นแพงมากสำหรับหน่วยความจำ )
หากคุณมีหน่วยความจำเหลือน้อยและคุณมีวัตถุที่ประเมินอย่างขี้เกียจเป็นอินพุตวิธีนี้เป็นทางออกที่ดีที่สุด
คุณสามารถใช้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()
และตอนนี้อยู่ใน