โปรแกรม Python เกี่ยวกับการทำงานของสตริง

ในบทช่วยสอนนี้ คุณจะเขียนโปรแกรม Python เพื่อแก้ไขคำถามที่พบบ่อยเกี่ยวกับการดำเนินการสตริง

คุณจะได้เรียนรู้วิธีตรวจสอบว่าสตริง Python เป็นพาลินโดรม แอนนาแกรม และอยู่ในตัวพิมพ์ของชื่อหรือไม่

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

ไวยากรณ์ [start: stop: step] คืนค่าสไลซ์ของสตริง ตั้งแต่เริ่มต้นจนถึงแต่ไม่รวมการหยุด โดยมีขั้นตอนขนาดขั้นตอน

  • หากคุณละเว้น start สไลซ์จะเริ่มต้นที่จุดเริ่มต้นของสตริง
  • หากคุณไม่ระบุดัชนีหยุด สไลซ์จะขยายไปถึงส่วนท้ายของสตริง
  • และค่าลบของขั้นตอนสามารถใช้เพื่อส่งคืนชิ้นส่วนที่เริ่มต้นจากจุดสิ้นสุดของสตริง
  วิธีการสร้างภาพตัดปะบน iPhone

ดังนั้น [::-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

ในโค้ดเซลล์ด้านบน รถแข่งคือพาลินโดรม ดังนั้นฟังก์ชัน is_palindrome() จะคืนค่า True ตามที่คาดไว้

ตอนนี้ ให้ลองเรียกใช้ฟังก์ชันด้วยสตริงใดๆ ที่ไม่ใช่พาลินโดรม เช่น แม่น้ำ

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

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

สามารถทำได้ง่ายขึ้นโดยใช้วัตถุตัวนับจากโมดูล itertools ดิ เคาน์เตอร์ วัตถุส่งคืนพจนานุกรม 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 เป็นแอนนาแกรม

  คุณสามารถย้อนอดีต GameCube บนทีวีสมัยใหม่ได้และมันน่าทึ่ง

เมื่อใช้ตรรกะนี้ เราสามารถไปข้างหน้าและกำหนดฟังก์ชัน are_anagrams() ด้วยพารามิเตอร์ 2 ตัว 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

วิธีตรวจสอบ Anagrams โดยใช้ Sorted Copies of Strings

มีอีกวิธีหนึ่งที่คุณสามารถทำได้

หากสองสตริงเป็นแอนนาแกรม สำเนาที่จัดเรียงจะเท่ากัน

ดังนั้นเราจึงสามารถเขียนฟังก์ชัน 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” ไม่ใช่แอนนาแกรม และฟังก์ชันจะคืนค่าเป็น “เท็จ”
are_anagrams("below","elbow")
True

are_anagrams("state","tasted")
False

ตรวจสอบว่าสตริง Python อยู่ในตัวพิมพ์ชื่อเรื่องหรือไม่

นี่คือคำถามสุดท้ายของเราสำหรับบทช่วยสอนนี้

ปัญหา: กำหนดสตริง: ชื่อบุคคล—พร้อมชื่อและนามสกุล

คุณต้องตรวจสอบว่าอักษรตัวแรกของทั้งชื่อและนามสกุลเป็นตัวพิมพ์ใหญ่หรือไม่

กรณีประเภทนี้โดยที่อักษรตัวแรกของแต่ละคำเป็นตัวพิมพ์ใหญ่เรียกว่าตัวพิมพ์ใหญ่

ดังนั้นคุณต้องตรวจสอบว่าชื่ออยู่ในตัวพิมพ์ชื่อเรื่องหรือไม่:

1. ถ้าใช่ ให้แสดงข้อความว่าการจัดรูปแบบอยู่ในตัวพิมพ์ของชื่อเรื่อง

2. มิฉะนั้น ให้ส่งคืนสำเนาของสตริงที่จัดรูปแบบไว้ในตัวพิมพ์ชื่อเรื่อง

  • Python มีเมธอดสตริงในตัว istitle() ซึ่งจะตรวจสอบว่าสตริงอยู่ในตัวพิมพ์ชื่อเรื่องหรือไม่
  วิธีย้อนกลับการค้นหาวิดีโอ

.istitle() คืนค่า True ถ้าสตริง ถูกจัดรูปแบบในกรณีหัวเรื่อง มิฉะนั้นจะคืนค่า False

  • และชื่อวิธีสตริงของ Python () จะส่งคืนสำเนาของสตริงที่จัดรูปแบบในกรณีชื่อ

ตอนนี้คุณสามารถใช้สองวิธีนี้เพื่อแก้ปัญหาได้

กำหนดฟังก์ชัน check_titlecase() ที่รับชื่อเป็นอาร์กิวเมนต์

  • คุณสามารถเรียกเมธอด 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

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

เรื่องล่าสุด

x