โปรแกรม Python เกี่ยวกับการทำงานของสตริง
เผยแพร่แล้ว: 2022-04-26ในบทช่วยสอนนี้ คุณจะเขียนโปรแกรม Python เพื่อแก้ไขคำถามที่พบบ่อยเกี่ยวกับ การดำเนินการสตริง
คุณจะได้เรียนรู้วิธีตรวจสอบว่าสตริง Python เป็น palindromes , anagrams หรือไม่ และอยู่ในตัว พิมพ์ของชื่อ
Python Strings: การตรวจสอบอย่างรวดเร็ว
ใน Python สตริงเป็นชนิดข้อมูลในตัวที่มีประสิทธิภาพ พวกเขาสามารถเก็บลำดับของตัวอักษร
การ สร้างดัชนีใน Python Strings: เช่นเดียวกับ Python iterables ทั้งหมด สตริงนั้นไม่มีการทำดัชนีด้วย ดังนั้น ดัชนีที่ถูกต้องสำหรับสตริงที่มีความยาว N คือ 0, 1, 2 จนถึง N – 1

Python ยังรองรับการสร้างดัชนีเชิงลบเพื่อเข้าถึงองค์ประกอบจากจุดสิ้นสุดของสตริง -1 คือดัชนีของอักขระตัวสุดท้ายในสตริง -2 คือดัชนีของอักขระตัวที่สองต่อท้ายในสตริง และอื่นๆ
ความไม่เปลี่ยนรูป ของสตริง Python : นอกจากนี้ สตริงใน Python นั้นไม่เปลี่ยนรูป ดังนั้นคุณ จึงไม่สามารถ แก้ไขได้ อย่างไรก็ตาม คุณสามารถเรียกใช้เมธอดสตริงได้หลายวิธีและรับสำเนาของสตริงพร้อมผลลัพธ์ที่ต้องการ
ตอนนี้เราได้ตรวจสอบพื้นฐานของสตริง Python แล้ว มาดำเนินการแก้ไขปัญหาง่ายๆ แต่น่าสนใจกัน
เริ่มกันเลย.
ตรวจสอบว่า Python String เป็น Palindrome หรือไม่
ปัญหา : กำหนดสตริง Python ให้ตรวจสอบว่าเป็นพาลินโดรมหรือไม่
ถ้าใช่ ให้คืนค่า True; มิฉะนั้นให้คืนค่าเท็จ
ดังนั้นปัญหาแรกของเราคือตรวจสอบว่าสตริงที่กำหนดเป็นพาลินโดรมหรือไม่
palindrome เป็นสตริงที่อ่านเหมือนกันจากซ้ายไปขวาและจากขวาไปซ้าย มาลงรายการตัวอย่างกัน: รถแข่ง รถอ้างอิง เลเวล มาดาม เรดาร์ และอื่นๆ

นี่คือขั้นตอนในการแก้ปัญหานี้:
- ขอรับ สำเนาของสตริงที่ย้อนกลับ และเก็บไว้ในตัวแปรอื่น หากจำเป็น
- เปรียบเทียบค่าของสตริงเดิมและสตริงที่ย้อนกลับ
- หากเท่ากัน สตริงจะเป็นพาลินโดรม ดังนั้นให้คืนค่า True และหยุด
- ถ้าต้นฉบับและสำเนากลับไม่เท่ากัน สตริงจะไม่ใช่พาลินโดรม ดังนั้นเราควรคืนค่า เท็จ
การดำเนินการหลักคือการขอรับสำเนากลับด้านของสตริง ใน Python มีหลายวิธีที่คุณทำได้
อย่างไรก็ตาม เราจะพูดถึงสองแนวทางต่อไปนี้:
- การใช้ สไลซ์สตริง
- การใช้ฟังก์ชัน reversed() และ join() method
วิธีย้อนกลับสตริง Python โดยใช้ Slicing
ไวยากรณ์ <any_str>[start: stop: step] คืนค่าสไลซ์ของสตริง <any_str> ตั้งแต่ start จนถึงแต่ไม่รวม stop ด้วยขั้นตอนขนาด step
- หากคุณละเว้น
startสไลซ์จะเริ่มต้นที่จุดเริ่มต้นของสตริง - หากคุณไม่ระบุดัชนี
stopสไลซ์จะขยายไปถึงส่วนท้ายของสตริง - และค่าลบของ
stepสามารถใช้เพื่อส่งคืนชิ้นส่วนที่เริ่มต้นจากจุดสิ้นสุดของสตริง
ดังนั้น <any_str>[::-1] จะส่งกลับสำเนาของสตริงที่กลับด้าน
เซลล์รหัสต่อไปนี้มีคำจำกัดความของฟังก์ชัน is_palindrome()
ใช้สตริงเป็นอาร์กิวเมนต์ และส่งกลับค่า True หรือ False ขึ้นอยู่กับว่าเป็น palindrome หรือไม่
ในที่นี้ เราได้ใช้การสไลซ์สตริงเพื่อรับสำเนาย้อนกลับของสตริง
def is_palindrome(this_str): rev_str = this_str[::-1] if (this_str == rev_str): return True else: return False️ ตอนนี้เราได้กำหนดฟังก์ชันแล้ว เราสามารถเรียกใช้สตริงที่ถูกต้องเป็นอาร์กิวเมนต์ได้
is_palindrome("racecar") True ในโค้ดเซลล์ด้านบน racecar คือพาลินโดรม ดังนั้นฟังก์ชัน is_palindrome() จะคืนค่า True ตามที่คาดไว้
ตอนนี้ ให้ลองเรียกใช้ฟังก์ชันด้วยสตริงใดๆ ที่ไม่ใช่พาลินโดรม เช่น river
is_palindrome("river") False และอย่างที่คุณเห็น มันจะคืนค่า False ซึ่งถูกต้อง
วิธีย้อนกลับสตริง Python โดยใช้ reversed() และ join()
ใน Python คุณสามารถใช้วิธี join() ร่วมกับฟังก์ชัน reversed() เพื่อย้อนกลับสตริง
- ฟังก์ชัน
reversed()ส่งคืนตัววนซ้ำย้อนกลับผ่านอักขระในสตริง - วิธีการ
join()สามารถใช้เพื่อรวมอักขระเหล่านั้นในลำดับที่กลับกัน
ด้วยวิธีการข้างต้น คุณสามารถเขียน is_palindrome() ใหม่ได้เช่นเดียวกับในเซลล์โค้ดด้านล่าง
def is_palindrome(this_str): rev_str = ''.join(reversed(this_str)) if (this_str == rev_str): return True else: return False คุณยังสามารถใช้ is_palindrome() ภายใน list comprehension เพื่อรวบรวม palindromes ทั้งหมดจากรายการสตริงที่ยาวกว่า
str_list = ["refer","blue","level","12321","dragon"] palindromes = [string for string in str_list if is_palindrome(string)] print(palindromes) # Output ['refer', 'level', '12321']นี่คือวิธีการทำงานของโค้ดด้านบน:
- ข้ามผ่าน
str_listเรียกis_palindrome()ในแต่ละสตริง - ถ้า
is_palindrome()คืนค่าTrueให้เพิ่มสตริงในรายการpalindromes
ดังที่คุณเห็นในผลลัพธ์ด้านบน palindromes เป็นรายการของสตริง palindromic ทั้งหมดใน str_list
ตรวจสอบว่าสตริง Python สองสตริงเป็น Anagrams หรือไม่
คำถามยอดนิยมอีกข้อที่คุณอาจพบในการสัมภาษณ์คือการตรวจสอบว่าสตริง str1 และ str2 เป็นแอนนาแกรมหรือไม่
สองสตริงเรียกว่าแอน นาแกรม ถ้าจำนวนอักขระในสองสตริงเท่ากันทุกประการ ซึ่งหมายความว่าคุณสามารถรับสตริงใดสตริงหนึ่งได้โดยการ เปลี่ยน หรือ จัดเรียง อักขระใหม่ในสตริงอื่น
ตัวอย่างของแอนนาแกรม ได้แก่ state-taste, save-vase, elbow-below เป็นต้น

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

สามารถทำได้ง่ายขึ้นโดยใช้วัตถุตัว Counter จากโมดูล itertools ออบเจ็กต์ Counter ส่งคืนพจนานุกรม Python: โดยมีอักขระเป็น คีย์ และค่าที่สอดคล้องกันนับเป็น ค่า
พิจารณาสตริง "save" และ "vase" ดังที่แสดงด้านล่าง
str1 = "save" str2 = "vase" ที่นี่ c1 และ c2 เป็นวัตถุที่นับจำนวนอักขระของสตริง str1 และ str2 ตามลำดับ
from collections import Counter c1 = Counter(str1) c2 = Counter(str2) print(c1) print(c2) c1 == c2 # Output Counter({'s': 1, 'a': 1, 'v': 1, 'e': 1}) Counter({'v': 1, 'a': 1, 's': 1, 'e': 1}) True c1 == c2 คืนค่า True เนื่องจาก str1 และ str2 เป็นแอนนาแกรม
เมื่อใช้ตรรกะนี้ เราสามารถไปข้างหน้าและกำหนดฟังก์ชัน are_anagrams() ด้วยพารามิเตอร์สองตัว word1 และ word2 ในตัวฟังก์ชัน เราตรวจสอบว่า Counter(word1) == Counter(word2) หรือไม่
def are_anagrams(word1, word2): if Counter(word1) == Counter(word2): return True else: return False ️ ในการตรวจสอบ ให้เรียก are_anagrams() ด้วย str1 , str2 เป็นอาร์กิวเมนต์ เนื่องจาก str1 และ str2 เป็นแอนนาแกรม (“บันทึก” และ “แจกัน”) ฟังก์ชันจะคืนค่า True ซึ่งถูกต้อง
are_anagrams(str1, str2) Trueวิธีตรวจสอบแอนนาแกรมโดยใช้สำเนาที่เรียงลำดับของสตริง
มีอีกวิธีหนึ่งที่คุณสามารถทำได้
หากสองสตริงเป็นแอนนาแกรม สำเนาที่จัดเรียง จะเท่ากัน
ดังนั้นเราสามารถเขียนฟังก์ชันใหม่ได้ are_anagrams() เพื่อตรวจสอบว่า str1 เวอร์ชันที่เรียงลำดับแล้วเหมือนกับ str2 ที่เรียงลำดับแล้วหรือไม่ หากเท่ากัน ทั้งสองสตริงจะเป็นแอนนาแกรม อย่างอื่นพวกเขาไม่ได้
โดยใช้วิธีการข้างต้นเพื่อตรวจสอบความเท่าเทียมกันของสำเนาที่เรียงลำดับ เราสามารถเขียนฟังก์ชัน are_anagrams() ใหม่ได้ดังนี้
def are_anagrams(word1, word2): if sorted(word1) == sorted(word2): return True else: return Falseให้เราทำการเรียกใช้ฟังก์ชันบางอย่าง
- สตริง "elbow" และ "below" เป็นแอนนาแกรมและฟังก์ชัน
are_anagrams()จะคืนค่าTrue - และ "state" และ "tated" ไม่ใช่แอนนาแกรม และฟังก์ชันจะคืนค่า
False
are_anagrams("below","elbow") True are_anagrams("state","tasted") Falseตรวจสอบว่า Python String อยู่ใน Title Case หรือไม่
นี่คือคำถามสุดท้ายของเราสำหรับบทช่วยสอนนี้
ปัญหา : ระบุสตริง: ชื่อบุคคล—พร้อมชื่อและนามสกุล
คุณต้องตรวจสอบว่าอักษรตัวแรกของทั้งชื่อและนามสกุลเป็นตัวพิมพ์ใหญ่หรือไม่
กรณีประเภทนี้โดยที่อักษรตัวแรกของแต่ละคำเป็นตัวพิมพ์ใหญ่เรียกว่า กรณีชื่อเรื่อง
ดังนั้นคุณต้องตรวจสอบว่าชื่ออยู่ในตัวพิมพ์ชื่อเรื่องหรือไม่:
1. ถ้าใช่ ให้แสดงข้อความว่าการจัดรูปแบบอยู่ในตัวพิมพ์ของชื่อเรื่อง
2. มิฉะนั้น ให้ส่งคืนสำเนาของสตริงที่จัดรูปแบบไว้ในตัวพิมพ์ชื่อเรื่อง

- Python มีเมธอดสตริงใน
istitle()ซึ่งจะตรวจสอบว่าสตริงอยู่ในตัวพิมพ์ชื่อเรื่องหรือไม่
<str>.istitle()คืนค่าTrueถ้าสตริง<str>ถูกจัดรูปแบบในกรณีหัวเรื่อง มิฉะนั้นจะคืนค่าFalse
- และ
title()จะส่งคืนสำเนาของสตริงที่จัดรูปแบบในกรณีชื่อ
ตอนนี้คุณสามารถใช้สองวิธีนี้เพื่อแก้ปัญหาได้
กำหนดฟังก์ชัน check_titlecase() ที่ยอมรับ name เป็นอาร์กิวเมนต์
- คุณสามารถเรียกใช้
istitle()บนสตริงอินพุตเพื่อตรวจสอบว่าจัดรูปแบบในกรณีของชื่อเรื่องหรือไม่ - หากเป็น
Trueคุณสามารถพิมพ์ว่าสตริงนั้นอยู่ในตัวพิมพ์ชื่อเรื่องแล้ว - มิฉะนั้น คุณสามารถเรียกเมธอด
title()และส่งคืนสำเนาของสตริงในชื่อตัวพิมพ์
เซลล์รหัสต่อไปนี้แสดงคำจำกัดความของ check_titlecase()
def check_titlecase(name): if name.istitle(): print(f"'{name}' is already formatted in title case.") else: return name.title() ให้เราเรียก check_titlecase() ด้วยอาร์กิวเมนต์
check_titlecase("jane smith") # Output Jane Smithในผลลัพธ์ด้านบน คุณจะเห็นว่าตอนนี้สตริง “Jane Smith” อยู่ในตัวพิมพ์ของชื่อ
️ ขอยกตัวอย่างอีกเรื่องหนึ่ง
check_titlecase("agatha Christie") # Output Agatha Christieคราวนี้ เรามาเรียกใช้ฟังก์ชันด้วยสตริงที่ขึ้นต้นด้วยหัวเรื่อง
check_titlecase("Grace Hopper") # Output 'Grace Hopper' is already formatted in title case.เราได้รับแจ้งว่าสตริงถูกจัดรูปแบบในกรณีหัวเรื่อง และฟังก์ชันทำงานตามที่คาดไว้
บทสรุป
ตอนนี้เรามาสรุปปัญหาที่เราได้พูดคุยกันไปแล้ว
- หากต้องการตรวจสอบว่าสตริงเป็นพาลินโดรมหรือไม่ ให้ตรวจสอบว่าสตริงและเวอร์ชันกลับด้านเท่ากันหรือไม่ คุณสามารถใช้การสไลซ์สตริงหรือเมธอดในตัวเพื่อย้อนกลับสตริง
- หากต้องการตรวจสอบว่าสตริงทั้งสองเป็นแอนนาแกรมหรือไม่ ให้ตรวจสอบว่าสำเนาที่จัดเรียงแล้วเท่ากันหรือไม่ และหากต้องการจัดเรียงสตริง ให้ใช้ฟังก์ชัน sorted() ในตัว
- หากต้องการตรวจสอบว่าชื่ออยู่ในตัวพิมพ์ของชื่อหรือไม่ ให้ใช้วิธีการ .istitle() สำหรับการตรวจสอบ และวิธี .title() เพื่อรับสำเนาของสตริงที่มีตัวพิมพ์ชื่อเรื่อง
ฉันหวังว่าคุณจะสนุกกับบทช่วยสอนนี้เกี่ยวกับสตริง Python ในขั้นตอนต่อไป เรียนรู้วิธีใช้การเข้าใจรายการใน Python หรือเรียนรู้เกี่ยวกับโอเปอเรเตอร์ที่ไม่เท่ากันใน Python
มีความสุขในการเรียนรู้และเขียนโค้ด!
