เวลาเราได้ raw data หรือ ข้อมูลดิบ ที่เป็น String ในรูปแบบ list หรือ array บ่อยครั้งเราจะพบว่าข้อมูลเหล่านี้มันไม่ clean หมายความว่ามันมี whitespace หรือตัวอักษรพิเศษที่เราไม่ต้องการอยู่เยอะมาก และเราจำเป็นต้องกำจัดมันออก เพื่อให้เหลือข้อมูลที่เราต้องการอย่างเดียวเท่านั้น

บทความนี้จะอธิบายการใช้ method ที่ชื่อว่า .strip() และ .join() ในการจัดการให้ข้อมูลมีระเบียบมากขึ้น โดยจะมีการใช้ for loop และ method .append() ร่วมด้วย และตรวจสอบชนิดของวัตถุนั้นด้วย attribute type()

ตัวอย่างข้อมูลที่ไม่ clean ด้านล่างเป็นบทกลอนบทหนึ่ง ที่มี whitespace และตัวอักษรพิเศษที่เราไม่ต้องการอยู่ในข้อมูลด้วย

still_i_rise = ['...You may write me down in history,,,    ',
               ' With your bitter, twisted lies,',
               '    You may tread me in the very dirt',
               ' But still, like dust, I’ll rise!!']

.strip()

ข้อมูลแต่ละตัวใน list นี้มีทั้ง whitespace และอักษรพิเศษที่เราไม่ต้องการ method .strip() จะใช้ลบ whitespace และตัวอักษรพิเศษเหล่านี้ออกจากด้านหน้าแต่ด้านหลัง String แต่ละตัวเท่านั้น หากมี whitespace หรืออักษรพิเศษที่อยู่ข้างใน String จะไม่ถูกลบ

argument

method .strip() สามารถใส่ argument ที่เราต้องการลบออกได้ หากเราไม่ใส่ argument โดยปล่อยให้ parameter นี้ว่างไว้ มันจะลบ whitespace ที่อยู่หน้าและหลัง String ให้

หากเราใส่ argument เป็นตัวอักษรที่เราต้องการลบ มันก็จะลบตัวอักษรนั้นให้ แต่ไม่ลบ whitespace หรือตัวอักษรอื่นๆ ที่อยู่ก่อนหน้าตัวอักษรพิเศษที่เราระบุให้มันลบ เพราะฉะนั้นเราอาจจะต้อง clean String ของเราหลายครั้งจนกว่าจะกำจัด whitespace และตัวอักษรที่ไม่ต้องการออกได้

ทีนี้มาลอง clean ข้อมูลของเราทีละลำดับ

เนื่องจากข้อมูลมีทั้ง whitespace และอักษรพิเศษค่อนข้างเยอะ เอาเป็นว่าขั้นแรกเราจะ clean whitespace ก่อนละกัน

clean_still_i_rise = []

for x in still_i_rise:
    clean_still_i_rise.append(x.strip())
    
print(clean_still_i_rise)

ขั้นแรกเราสร้าง list ว่าง หรือเรียกว่า empty list ก่อน เพื่อเอาไว้เก็บข้อมูลที่เรา clean แล้ว
สิ่งที่เราจะทำก็คือ เราจะดึงข้อมูลออกมาจากลิสเก่า คือ still_i_rise จากนั้นทำความสะอาดข้อมูลนั้น แล้วเอาข้อมูลนั้นไปใส่ในลิสใหม่ที่ชื่อ clean_still_i_rise

เราไม่สามารถทำความสะอาดข้อมูลทุกตัวรวดเดียวได้ เราจึงต้องใช้ for loop ช่วย ลูปวนข้อมูลไปทีละตัว
เราตั้งตัวแปร x ขึ้นมาให้เป็นตัวแทนของข้อมูลที่เราจะลูป

ในบรรทัดที่ 5 จะอ่านได้ว่า “หาก x เป็นข้อมูลใดๆในลิส still_i_rise ให้:”
เครื่องหมาย : (colon) ที่หลังบรรทัดที่ 5 บอกให้เรารู้ว่าจะมีคำสั่งต่อจากนี้

บรรทัดที่ 6 เราจะยกลิสใหม่ที่เราสร้างไว้สำหรับเก็บข้อมูลที่เราทำความสะอาดแล้วขึ้นมา จากนั้นใช้ method .append() ซึ่ง method จะเพิ่มข้อมูลในลิสที่อยู่ด้านหน้าจุด (ในที่นี้คือลิสว่างที่เราสร้างไว้) ด้วยข้อมูลที่อยู่ในเครื่องหมายวงเล็บของ method

มาดูข้อมูลที่อยู่ในเครื่องหมายวงเล็บของ method .append()
เราใช้ method .strip() ลบ whitespace ออกจาก x
x คืออะไร? ก็ต้องกลับไปดูบรรทัดที่ 5 x คือ ข้อมูลใดๆก็ตามในลิส still_i_rise หมายความว่า ในการวน for loop รอบแรก x เป็นตัวแทนของข้อมูลตัวที่ 1 (‘…You may write me down in history ,,, ‘) เมื่อเราเอาข้อมูลนี้มาเข้า method จะได้เป็น

x = '...You may write me down in history,,,    '
x.strip()
print(x)

output:
'...You may write me down in history,,,'

ดังนั้นข้อมูลของ x หลังวนลูปรอบแรกจะเปลี่ยนไป คือไม่มี whitespace ด้านหลังข้อมูลอีกแล้ว จากนั้นนำข้อมูลใหม่นี้เข้าไปเก็บในลิสใหม่ที่สร้างไว้ clean_still_i_rise
x จะวนลูปไปเรื่อยๆ จนกว่าจะวนไปถึงข้อมูลตัวสุดท้าย

เมื่อวนจนหมดแล้ว เราจะได้ข้อมูลในลิสใหม่ดังนี้

clean_still_i_rise = ['...You may write me down in history,,,', 
                      'With your bitter, twisted lies,', 
                      'You may tread me in the very dirt', 
                      'But still, like dust, I’ll rise!!']

จะเห็นว่าข้อมูลแต่ละตัวยังคงมีอักษรพิเศษที่เราไม่ต้องการอยู่ เช่น จุด เครื่องหมายคอมม่า อัศเจรีย์ และ whitespace อยู่ เราต้องดูว่าอักษรพิเศษไหนอยู่รอบนอกสุด (หน้า-หลังของข้อมูล)

clean2_still_i_rise = []
for x in clean_still_i_rise:
    clean2_still_i_rise.append(x.strip('.'))
print(clean2_still_i_rise)

ตัวอย่างต่อมา เราทำการ clean ครั้งที่สองเพื่อเอาเครื่องหมายจุดออก ดังนั้นใน method .strip() เราต้องระบุ argument เป็นเครื่องหมายจุดที่อยู่ในเครื่องหมายคำพูด (single quote หรือ double quote ก็ได้)

เมื่อเอาเครื่องหมายจุดออก และเอาข้อมูลทั้งหมดที่เรา clean แล้วไปใส่ในลิสอันใหม่อีกหนึ่งอันชื่อ clean2_still_i_rise จะได้ข้อมูลใหม่ดังนี้

clean2_still_i_rise = ['You may write me down in history,,,',
                       'With your bitter, twisted lies,', 
                       'You may tread me in the very dirt', 
                       'But still, like dust, I’ll rise!!']

ครั้งนี้จะเห็นว่าไม่มีเครื่องหมายจุดรอบๆข้อมูลแต่ละตัวแล้ว สิ่งที่เราต้องกำจัดต่อมา คือ เครื่องหมายคอมม่า

clean3_still_i_rise = []
for x in clean2_still_i_rise:
    clean3_still_i_rise.append(x.strip(','))
print(clean3_still_i_rise)

เราจะนำเอาข้อมูลจากครั้งล่าสุดที่เรา clean ครั้งที่ 2 มากำจัดคอมม่าออก ผลที่ได้คือ

clean3_still_i_rise = ['You may write me down in history', 
                       'With your bitter, twisted lies', 
                       'You may tread me in the very dirt', 
                       'But still, like dust, I’ll rise!!']

เมื่อเรากำจัดคอมม่าออกหมดแล้ว จะเห็นว่าข้อมูลตัวสุดท้ายในลิสมีเครื่องหมายอัศเจรีย์อยู่ หากเราไม่ต้องการเครื่องหมายนี้ เราสามารถกำจัดออกได้โดยวิธีเดิม

clean4_still_i_rise = []
for x in clean3_still_i_rise:
    clean4_still_i_rise.append(x.strip('!'))
print(clean4_still_i_rise)

ผลที่ได้

clean4_still_i_rise = ['You may write me down in history', 
                       'With your bitter, twisted lies', 
                       'You may tread me in the very dirt', 
                       'But still, like dust, I’ll rise']

จะเห็นว่าครั้งนี้ลิสของเราสะอาดดีแล้ว ไม่มีเครื่องหมายอะไรให้รกตา แต่ยังอ่านยากอยู่ เพราะมันอยู่ในรูปของลิสที่ครอบด้วยเครื่องหมาย [] และมีคอมม่าคั่นข้อมูลแต่ละตัว เราสามารถแปลงลิสให้กลายเป็นข้อความยาวๆ เหมือนข้อความที่เห็นได้ทั่วไปได้ และยังสามารถเลือกให้ข้อมูลแต่ละตัวแสดงอยู่บนบรรทัดของตัวเอง เหมือนการอ่านบทกลอนได้อีกด้วย ในการกระทำดังกล่าว เราจะใช้ method .join()

.join()

method .join() จะช่วยเชื่อมข้อมูลแต่ละตัวในลิสให้กลายเป็นข้อมูลเดียวกันได้ และเราสามารถเลือกได้ว่าเราจะให้มันเชื่อมด้วยอะไร นอกจากนี้ยังใช้แปลงลิสให้กลายเป็นข้อมูลที่เป็นข้อความ หรือเป็น string ได้อีกด้วย

full_poem = '\n'.join(clean4_still_i_rise)
print(full_poem)

ในบรรทัดที่ 31 เราสร้างตัวแปรใหม่ชื่อ full_poem เพื่อเก็บข้อมูลที่ได้จาก method .join()

การใช้ .join() เราต้องระบุหน้าเครื่องหมายจุด หรือหน้า method ว่าเราต้องการใช้อะไรเชื่อมข้อมูลแต่ละตัวเข้าด้วยกัน ในตัวอย่างเราใช้ ‘\n’ เรียกว่า escape letter ใช้ในการขึ้นบรรทัดใหม่ ดังนั้นข้อมูลตัวแรกกับข้อมูลตัวที่สอง จะเชื่อมกันด้วยการขึ้นบรรทัดใหม่ และเครื่องหมายคอมม่าซึ่งเป็นลักษณะของลิสที่ใช้คั่นข้อมูลและข้อมูลตัวถัดไปอื่นๆ จะหายไป

You may write me down in history
With your bitter, twisted lies
You may tread me in the very dirt
But still, like dust, I’ll rise

เราสามารถตรวจสอบชนิดของข้อมูลได้โดยใช้ attribute type()

ลองยกตัวอย่างให้ใช้ method .join() เชื่อมข้อมูลในลิสอีกครั้งและเก็บในตัวแปรใหม่ แต่ครั้งนี้เราจะคลุมรอบ method ด้วย [] และเชื่อมข้อมูลด้วยเครื่องหมายบวกแทน

lst_full_poem = ['+'.join(clean4_still_i_rise)]
print(lst_full_poem)

print('data type of full_poem: ', type(full_poem))
print('data type of lst_full_poem: ', type(lst_full_poem))

ตัวแปรใหม่ชื่อว่า lst_full_poem และครั้งนี้เราเชื่อมข้อมูลด้วยเครื่องหมายบวก ใช้ attribute type() เรียกดูชนิดข้อมูลได้ดังนี้

['You may write me down in history+With your bitter, twisted lies+You may tread me in the very dirt+But still, like dust, I’ll rise']

data type of full_poem:  <class 'str'>
data type of lst_full_poem:  <class 'list'>

จะเห็นว่าข้อมูลใน lst_full_poem จะเชื่อมกันด้วยเครื่องหมาย + และยังอยู่ในรูปของลิส เมื่อใช้ attribute type() เรียกดูชนิดข้อมูล จะพบว่า full_poem มีชนิดข้อมูลเป็น <class ‘str’> ในขณะที่ lst_full_poem มีชนิดข้อมูลเป็น <class ‘list’>