โปรแกรม 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
มีความสุขในการเรียนรู้และเขียนโค้ด!