โปรแกรม 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 เป็นสตริงที่อ่านเหมือนกันจากซ้ายไปขวาและจากขวาไปซ้าย มาลงรายการตัวอย่างกัน: รถแข่ง รถอ้างอิง เลเวล มาดาม เรดาร์ และอื่นๆ

python-string-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 เป็นต้น

python-strings-anagrams

วิธีตรวจสอบ 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-string-title-case
  • 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

มีความสุขในการเรียนรู้และเขียนโค้ด!