มีสองประเด็นหลักที่ควรพิจารณาที่นี่:
- การคาดหวังว่าผลลัพธ์
'/segment/segment/'.split('/')
จะเท่ากับ['segment', 'segment']
นั้นสมเหตุสมผล แต่ก็ทำให้สูญเสียข้อมูลไป ถ้าsplit()
ได้ผลในแบบที่คุณต้องการถ้าฉันบอกคุณa.split('/') == ['segment', 'segment']
คุณก็ไม่สามารถบอกฉันได้ว่าa
คืออะไร
- ผลของ
'a//b'.split()
be คืออะไร? ['a', 'b']
?, หรือ['a', '', 'b']
? เช่นควรsplit()
ผสานตัวคั่นที่อยู่ติดกัน? หากควรจะเป็นเรื่องยากมากที่จะแยกวิเคราะห์ข้อมูลที่คั่นด้วยอักขระและบางฟิลด์อาจว่างเปล่า ผมค่อนข้างแน่ใจว่ามีหลายคนที่ทำต้องการค่าว่างในผลการกรณีข้างต้น!
ในท้ายที่สุดมันก็เดือดเป็นสองอย่าง:
ความสอดคล้อง: ถ้าฉันมีn
ตัวคั่นa
ฉันจะได้รับn+1
ค่ากลับมาหลังจากsplit()
.
มันควรจะเป็นไปได้ที่จะทำสิ่งที่ซับซ้อนและทำสิ่งง่ายๆง่ายๆ: หากคุณต้องการละเว้นสตริงว่างอันเป็นผลมาจากสิ่งเหล่าsplit()
นี้คุณสามารถทำได้เสมอ:
def mysplit(s, delim=None):
return [x for x in s.split(delim) if x]
แต่ถ้าใครไม่ต้องการละเว้นค่าว่างก็ควรจะทำได้
ภาษาต้องเลือกหนึ่งคำจำกัดความของsplit()
- มีกรณีการใช้งานที่แตกต่างกันมากเกินไปเพื่อตอบสนองความต้องการของทุกคนเป็นค่าเริ่มต้น ฉันคิดว่าตัวเลือกของ Python นั้นดีและมีเหตุผลมากที่สุด (นอกจากเหตุผลหนึ่งที่ฉันไม่ชอบ C strtok()
ก็เพราะมันรวมตัวคั่นที่อยู่ติดกันทำให้ยากมากที่จะแยกวิเคราะห์ / โทเค็นอย่างจริงจังด้วย)
มีข้อยกเว้นอย่างหนึ่ง: การa.split()
ไม่มีอาร์กิวเมนต์จะบีบพื้นที่สีขาวติดต่อกัน แต่เราสามารถโต้แย้งได้ว่านี่เป็นสิ่งที่ถูกต้องที่จะทำในกรณีนั้น a.split(' ')
หากคุณไม่ต้องการพฤติกรรมที่คุณสามารถเสมอ