การแยกสตริงและลบช่องว่าง Python

ฉันต้องการแยกสตริงด้วยเครื่องหมายจุลภาค ',' และลบช่องว่างออกจากจุดเริ่มต้นและจุดสิ้นสุดของการแยกแต่ละครั้ง

ตัวอย่างเช่น ถ้าฉันมีสตริง:

"QVOD, Baidu Player"

ฉันต้องการแยกและตัดไปที่:

['QVOD', 'Baidu Player']

มีวิธีที่สง่างามในการทำเช่นนี้หรือไม่? อาจใช้รายการความเข้าใจ?


person Daniel Pilch    schedule 21.01.2014    source แหล่งที่มา
comment
รูปแบบของข้อมูลจะเหมือนเดิมตลอดไปหรือไม่?   -  person thefourtheye    schedule 21.01.2014
comment
อาจซ้ำกับ คำถามนี้ ไม่สมบูรณ์ แต่คุณสามารถค้นหาคำตอบทั้งหมดที่คุณต้องการได้ที่นั่น   -  person Kraay89    schedule 21.01.2014
comment
@ Kraay89 ไม่ซ้ำกับคำถามที่คุณเชื่อมโยงไป   -  person Toby Allen    schedule 20.02.2014


คำตอบ (2)


Python มีฟังก์ชันที่น่าทึ่งที่เรียกว่า split ซึ่งจะทำให้คุณไม่ต้องใช้ regex หรืออะไรที่คล้ายกัน คุณสามารถแยกสตริงของคุณได้โดยเพียงแค่โทร my_string.split(delimiter)

หลังจากนั้น python จะมีฟังก์ชัน strip ซึ่งจะลบช่องว่างทั้งหมดออกจากจุดเริ่มต้นและจุดสิ้นสุดของสตริง

[item.strip() for item in my_string.split(',')]

เกณฑ์มาตรฐานสำหรับทั้งสองวิธีมีดังต่อไปนี้:

>>> import timeit
>>> timeit.timeit('map(str.strip, "QVOD, Baidu Player".split(","))', number=100000)
0.3525350093841553
>>> timeit.timeit('map(stripper, "QVOD, Baidu Player".split(","))','stripper=str.strip', number=100000)
0.31575989723205566
>>> timeit.timeit("[item.strip() for item in 'QVOD, Baidu Player'.split(',')]", number=100000)
0.246596097946167

ดังนั้นรายการคอมพ์จึงเร็วกว่าแผนที่ประมาณ 33%

อาจเป็นที่น่าสังเกตว่า ในส่วนของ "pythonic" นั้น Guido เองก็โหวตให้ LC http://www.artima.com/weblogs/viewpost.jsp?thread=98196

person Slater Victoroff    schedule 21.01.2014
comment
@DSM อ๊ะ แย่จัง ขอบคุณที่จับสิ่งนั้น - person Slater Victoroff; 21.01.2014
comment
ขอบคุณ ฉันลองสิ่งนี้แล้วและแต่ละส่วน QVOD ect.. จะถูกวางไว้บนบรรทัดใหม่ คำตอบด้านล่างนี้ใช้ได้ผลดีเนื่องจากทุกอย่างอยู่ในรายการ - person Daniel Pilch; 21.01.2014
comment
@DanielPilch: ทั้งสองวิธีสร้างรายการเดียวกัน - person DSM; 21.01.2014
comment
@SlaterTyranus โปรดตรวจสอบรหัสที่อัปเดต สิ่งนี้อาจทำงานได้เกือบเร็วเท่ากับ LC - person thefourtheye; 21.01.2014
comment
@thefourtheye มันเร็วกว่ารุ่นอื่น แต่ก็ยังช้ากว่า LC อย่างเห็นได้ชัด - person Slater Victoroff; 21.01.2014
comment
@SlaterTyranus โปรดอย่าให้มันแตกต่างกันไปในแต่ละเครื่อง ตรวจสอบผลลัพธ์บนเครื่องของฉัน :) - person thefourtheye; 21.01.2014
comment
ใช่ คุณพูดถูก ฉันกำลังพิมพ์รายการและไม่ได้สร้างรายการจากความเข้าใจ categories = [item.strip() for item in my_string.split(',')] ข้อผิดพลาดไร้สาระ และใช่ มันเร็วกว่า ขอบคุณ! - person Daniel Pilch; 21.01.2014
comment
@StevenRumbalski ข้อโต้แย้งระหว่างฟังก์ชัน LC และ map, reduce, filter นั้นค่อนข้างดี ดังนั้นฉันคิดว่ามันไม่จำเป็นต้องมีการอภิปรายมากนัก แต่เชื่อมโยงกับบทความเพื่อพยายามครอบคลุมในแง่มุมนั้น - person Slater Victoroff; 21.01.2014

วิธีการทำงานเล็กน้อย split ฟังก์ชันแยกสตริงตาม , และแต่ละองค์ประกอบจะถูกแยกออกด้วย str.strip โดย map

>>> stripper = str.strip
>>> map(stripper, "QVOD, Baidu Player".split(","))
['QVOD', 'Baidu Player']

การเปรียบเทียบเวลาเล็กน้อย

import timeit
stripper = str.strip
print timeit.timeit('map(stripper, "QVOD, Baidu Player".split(","))', "from __main__ import stripper", number=100000)
print timeit.timeit("[item.strip() for item in 'QVOD, Baidu Player'.split(',')]", number=100000)

เอาต์พุตบนเครื่องของฉัน

0.553178071976
0.569463968277

ดังนั้นทั้งวิธี List comprehension และวิธี map จึงมีการทำงานเกือบจะเหมือนกัน

person thefourtheye    schedule 21.01.2014
comment
เหตุใดคุณจึงกำหนด str.strip ให้กับตัวแปร ทำไมไม่ผ่านโดยตรง -map(str.strip, "QVOD, Baidu Player".split(",")) - person pyrospade; 21.01.2014
comment
@pyrospade ไม่จำเป็นต้องได้รับจาก str ทุกครั้ง ดังนั้นประสิทธิภาพเพิ่มขึ้นเล็กน้อย :) - person thefourtheye; 21.01.2014
comment
@thefourtheye จริงเหรอ? ฉันจินตนาการว่าเมื่อคุณส่ง str.strip ถึง map(function, sequence) มันจะได้รับการกำหนดให้กับพารามิเตอร์ function และใช้ภายในเครื่องเป็นตัวแปรที่นั่น - person pyrospade; 21.01.2014
comment
@thefourtheye คุณใช้ python เวอร์ชันใดอยู่? - person Slater Victoroff; 21.01.2014