Tìm nguyên âm trong chuỗi Python bằng regex

Ưu điểm của chuỗi thô là bạn không phải thoát (thêm một số \ trước) một số ký tự nhất định, chẳng hạn như dấu ngoặc kép và chính ký tự dấu gạch chéo ngược. Bạn không sử dụng bất kỳ ký tự nào bạn cần thoát ở đây, vậy tại sao lại sử dụng chuỗi thô?

match_obj = list(...)
if len(list(match_obj)) != 0:
    ...

match_obj = list(...)
if len(list(match_obj)) != 0:
    ...
0 đã là một danh sách; . Chỉ cần sử dụng trực tiếp
match_obj = list(...)
if len(list(match_obj)) != 0:
    ...
0

match_obj = list(...)
if len(match_obj) != 0:
    ...

Tất nhiên, danh sách có độ dài bằng 0 là giả và bất kỳ danh sách nào có độ dài khác 0 đều là trung thực, vì vậy bạn không cần kiểm tra

match_obj = list(...)
if len(list(match_obj)) != 0:
    ...
2

match_obj = list(...)
if match_obj:
    ...

Hàm

match_obj = list(...)
if len(list(match_obj)) != 0:
    ...
3 trả về một trình vòng lặp và tránh xây dựng kết quả hoàn chỉnh, vì vậy bạn có thể xử lý từng phần một chuỗi, phân bổ mức sử dụng bộ nhớ theo thời gian thay vì thu thập và trả về tất cả kết quả ngay lập tức

Chuyển kết quả của

match_obj = list(...)
if len(list(match_obj)) != 0:
    ...
3 đến
match_obj = list(...)
if len(list(match_obj)) != 0:
    ...
5 ngay lập tức chạy trình vòng lặp để hoàn thành, thu thập tất cả kết quả vào danh sách trong bộ nhớ. Bất kỳ hiệu quả nào đạt được bằng cách sử dụng phiên bản trình vòng lặp đều bị mất và thực sự có thể làm giảm hiệu suất vì công việc cần thiết để tạo trình vòng lặp, lưu trạng thái tạm thời, v.v. , đã lãng phí

Điều duy nhất bạn làm với các đối tượng khớp kết quả là gọi

match_obj = list(...)
if len(list(match_obj)) != 0:
    ...
6 trên chúng để nhận văn bản khớp

Vậy tại sao không sử dụng which trả về danh sách các chuỗi phù hợp?

    matches = re.findall(r'(?<=[qwrtypsdfghjklzxcvbnm])([aeiou]{2,})(?=[qwrtypsdfghjklzxcvbnm])', string, re.IGNORECASE))
    if matches:
        for match in matches:
            print(match)
    else:
        print(-1)

Điều này sẽ không làm cho mã nhỏ gọn hơn hoặc hiệu quả hơn, nhưng nó có thể làm cho mã dễ bảo trì và dễ đọc hơn

match_obj = list(...)
if len(list(match_obj)) != 0:
    ...
8 có phải là danh sách đầy đủ các phụ âm không?

Đôi khi "y" được coi là một nguyên âm. Nếu bạn muốn đưa nó vào, bạn phải thêm "y" vào danh sách nguyên âm và xóa nó hai lần khỏi danh sách phụ âm

Chuỗi là một yếu tố thiết yếu trong lập trình. Có thể là đánh giá trực tuyến, vòng kỹ thuật hoặc phỏng vấn, bạn sẽ thường thấy các vấn đề liên quan đến chuỗi trong hành trình vị trí của mình. (Tôi không dám nói luôn, nhưng có lẽ trong mỗi vòng. )

Nếu bạn đang nhắm đến một công ty MAANG hoặc bất kỳ công ty dựa trên dịch vụ nào, bạn phải thành thạo các chuỗi vì đây luôn là một phần không thể thiếu trong các thử thách tuyển dụng. Ngoài việc tuyển dụng, đây cũng là những viên đá khởi đầu tốt cho lập trình cạnh tranh

Vì chúng ta đang nói về chủ đề thử thách tuyển dụng, nên một trong những câu hỏi phổ biến nhất mà bạn sẽ gặp phải là cách đếm số nguyên âm trong một chuỗi bằng Python. Hôm nay, chúng ta sẽ thảo luận về vấn đề này, các biến thể của nó và các cách tiếp cận khác nhau để giải quyết vấn đề này. Vậy hãy bắt đầu

Làm thế nào để đếm số nguyên âm trong một chuỗi?

Đây là tuyên bố vấn đề. "Bạn được cung cấp một chuỗi, được tạo thành từ bảng chữ cái, ký tự đặc biệt hoặc số. Bạn cần đếm số nguyên âm trong chuỗi đã cho. "

Âm thanh như một nhiệm vụ dễ dàng, phải không?

Có 5 nguyên âm. ['a', 'e', ​​'i', 'o', 'u']

Vì các ngôn ngữ lập trình thường phân biệt chữ hoa chữ thường, do đó để xác định số lượng nguyên âm trong một chuỗi, bạn cần xem xét cả ký tự chữ hoa và chữ thường. Do đó, bạn sẽ có 10 ký tự trong danh sách nguyên âm là

['a' , 'e', ​​'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U']

Có nhiều biến thể cho tuyên bố vấn đề nhất định. Hãy bắt đầu với điều dễ dàng và xây dựng theo cách của chúng ta đến mức độ phức tạp của nó

Hãy xem một ví dụ

Chúng tôi được cung cấp một chuỗi. "Đếm số nguyên âm trong Chuỗi trong Python"

Các nguyên âm bao gồm [ 'a', 'e', ​​'i', 'o', 'u' ] (hiện tại, chúng ta chỉ xem xét các bảng chữ cái viết thường)

Tham khảo hình ảnh bên dưới để hiểu nhanh vấn đề

đầu ra. 12

Bây giờ bạn đã có hiểu biết cơ bản về vấn đề, hãy chuyển sang cách tiếp cận đầu tiên của chúng tôi

01) Phương pháp tiếp cận bạo lực

Đây sẽ là cách tiếp cận cơ bản nhất và đầu tiên của bạn đối với một vấn đề. Hãy nhớ rằng khi tham gia một cuộc phỏng vấn, sẽ rất hữu ích khi bắt đầu với cách tiếp cận thô bạo. Vì vậy, ngay cả khi bạn không đạt được câu trả lời tối ưu, bạn vẫn có thể thể hiện khả năng xây dựng logic và cách nhìn rõ ràng của mình về vấn đề

Ngoài ra, điều này giúp bạn làm rõ ý tưởng của mình tại cuộc phỏng vấn và giúp bạn giải thích giải pháp của mình tốt hơn cho người phỏng vấn

Vì vậy, hãy chuyển sang Phương pháp Brute Force của chúng ta để đếm số lượng nguyên âm trong một chuỗi,

thuật toán

  1. Lấy một chuỗi làm đầu vào của người dùng
  2. Khởi tạo biến đếm bằng 0
  3. Lặp lại từng ký tự của chuỗi
  4. Kiểm tra "NẾU" ký tự là một nguyên âm
  5. Nếu ký tự là nguyên âm, hãy tăng giá trị của biến đếm lên 1
  6. Khác tiếp tục lặp qua chuỗi
  7. Phá vỡ vòng lặp khi chuỗi kết thúc

Dưới đây là biểu đồ mô tả luồng của phương pháp trên

Vì vòng lặp chỉ chạy hết chiều dài của xâu nên vòng lặp chạy cụ thể n lần. Do đó, Độ phức tạp về thời gian cho cách tiếp cận vũ phu là O(n)

Bây giờ bạn đã hiểu giải pháp vũ phu, đã đến lúc đưa nó vào hành động. Hãy bắt đầu với việc mã hóa giải pháp vũ phu của chúng tôi để đếm các nguyên âm trong một chuỗi bằng Python

# Program: Count number of vowels in a String in Python

example = "Count number of vowels in a String in Python"

# initializing count variable
count = 0

# declaring a variable for index
i = 0

# iterate over the given string (example)
# len(example) -> gives the length of the string in Python

for i in range(len(example)):
    if (
        (example[i] == "a")
        or (example[i] == "e")
        or (example[i] == "i")
        or (example[i] == "o")
        or (example[i] == "u")
    ):
        count += 1

print("Number of vowels in the given string is: ", count)

 

Hàm range() được sử dụng ở đây để tăng giá trị của i lên 1 và để kiểm tra xem giá trị của i có nằm trong khoảng từ 0 đến độ dài của chuỗi không

đầu ra

Number of vowels in the given string is:  12

 

Phương pháp trên là cách tiếp cận cơ bản nhất cho vấn đề này. Bây giờ, chúng ta hãy cùng nhau tối ưu hóa mã này

Lưu ý rằng chúng tôi đã sử dụng toán tử 'hoặc' để so sánh ký tự với nguyên âm. Bạn có thể tránh nhiều toán tử "hoặc" này bằng cách sử dụng toán tử "in" tại đây. Hãy cùng kiểm tra nào

Tối ưu hóa bằng toán tử 'in'

# Program: Count number of vowels in a String in Python

example = "Count number of vowels in a String in Python"

# initializing count variable
count = 0

# creating a list of vowels
vowels = ["a", "e", "i", "o", "u"]

# iterate over the given string (example)
# len(example) -> gives the length of the string in Python
# Note that python can also declare the variable at the time of calling
for i in range(len(example)):
    if example[i] in vowels:
        count += 1

print("Number of vowels in the given string is: ", count)

 

đầu ra

Number of vowels in the given string is:  12

 

Trong Python, toán tử 'in' xác định xem một giá trị đã cho có xuất hiện trong chuỗi đã cho hay không (như chuỗi, mảng, danh sách hoặc bộ). Trong đoạn mã trên, chúng tôi đã tạo một danh sách lưu trữ các nguyên âm. Bằng cách này, bạn cũng có thể thêm các ký tự viết hoa của Nguyên âm vào danh sách

Do đó, tuyên bố ->

    if example[i] in vowels:

kiểm tra xem ký tự (ví dụ [i]) có trong danh sách (nguyên âm). Điều này dẫn đến 'Đúng' nếu đúng, đó là trường hợp của nguyên âm, nếu không, nó sẽ xuất ra 'Sai'

Thay vì danh sách, bạn có thể sử dụng bất kỳ trình tự nào ở đây, như - "aeiouAEIOU" hoặc ("aeiou")

Lưu ý rằng trong cả hai cách tiếp cận ở trên, chúng tôi đã sử dụng chỉ mục của chuỗi để lặp lại từng ký tự. Hãy thử gọi một vòng lặp cho từng mục đích

02) Đếm số nguyên âm trong chuỗi bằng vòng lặp for (như for-each)

Vòng lặp for-each là một câu lệnh luồng điều khiển lặp qua các phần tử trong một chuỗi hoặc tập hợp. Không giống như các vòng lặp khác, nó lặp lại trên tất cả các phần tử thay vì giữ một bộ đếm, biến vòng lặp hoặc kiểm tra một điều kiện sau mỗi lần lặp lại vòng lặp

Trong Python, bạn có thể sử dụng vòng lặp for dưới dạng vòng lặp for-each. Hãy xem làm thế nào

# Program: Count number of vowels in a String in Python

# example string
example = "Favtutor article"

vowels = ["a", "e", "i", "o", "u"]
count = 0

# using for-each loop, character is reference to a letter in the string
for character in example:
    if character in vowels:
        count += 1


print("Number of vowels in the given string is: ", count)

 

đầu ra

Number of vowels in the given string is:  6

 

Trong đoạn mã trên, biến 'ký tự' đề cập đến từng ký tự trong chuỗi 'ví dụ'. Vòng lặp chạy cho từng ký tự trong chuỗi, do đó, nó không thực sự yêu cầu biến đếm để lặp qua chuỗi

03) Đếm số nguyên âm trong một chuỗi với khả năng hiểu danh sách

Bạn có thể đếm số nguyên âm trong Chuỗi bằng một dòng mã không?

Đáng ngạc nhiên, bạn có thể

Python cung cấp Khả năng hiểu danh sách, cung cấp cú pháp ngắn hơn để tạo danh sách mới dựa trên các giá trị của danh sách hiện có. Khả năng hiểu danh sách Python được tạo thành từ các dấu ngoặc chứa biểu thức, được thực thi cho từng phần tử, cũng như vòng lặp for, được sử dụng để lặp qua các phần tử của danh sách

Hãy cùng kiểm tra nào

# Program: Count number of vowels in a String in Python

example = "Favtutor article"

# list comprehension
count = len([char for char in example if char in "aeiouAEIOU"])

print("Number of vowels: ", count   )

 

đầu ra

Number of vowels:  6

 

Lưu ý rằng chúng tôi đã rút ngắn toàn bộ vòng lặp thành một dòng

Khó hiểu?

Hàm len() được sử dụng để trả về độ dài của danh sách mới được tạo. Đây là hàm len() thực sự đưa ra số lượng nguyên âm trong chuỗi

Vòng lặp lặp lại cho từng ký tự trong chuỗi và kiểm tra xem ký tự 'nếu' có phải là nguyên âm hay không. Nếu có, thì nó sẽ thêm ký tự đó vào danh sách. Do đó, cuối cùng, hàm len() trả về độ dài của danh sách bao gồm tất cả các nguyên âm trong chuỗi đã cho

Khó hiểu?

Chúng ta hãy xem qua hậu trường của việc hiểu danh sách này

Chuỗi = "Bài viết Favtutor"

Khả năng hiểu danh sách của chúng tôi = len([char cho char trong ví dụ nếu char trong "aeiouAEIOU"])

Các nguyên âm trong chuỗi được thêm vào danh sách mới. Điều này xảy ra khi chúng ta lặp qua chuỗi theo từng ký tự

Nhìn vào hình ảnh dưới đây để hiểu rõ hơn-

04) Sử dụng biểu thức ReGex

Python cung cấp 're module' để dễ dàng làm việc với các biểu thức regex. Mô-đun re trong Python cung cấp hàm findall(), giúp tìm kết quả khớp cho một mẫu nhất định trong chuỗi đã cho

Chúng ta có thể sử dụng hàm findall() để lấy số nguyên âm trong chuỗi. Chúng ta hãy xem mã

# Program: Count number of each vowel in a string in Python

import re

string = "Article: Count number of each vowel in a string in Python"

# using findall() function to match pattern
# Meta character '|' is used to depict 'either-or' sequence
vowels = re.findall("a|e|i|o|u", string)
print(vowels)
# count of number of vowels in the string
print(len(vowels))

 

đầu ra

Number of vowels in the given string is:  12
0

 

05) Sử dụng phương thức 'count()'

Python cung cấp một phương thức count() để đếm số phần tử được chỉ định trong bất kỳ lần lặp nào (như chuỗi, danh sách)

Cú pháp cơ bản của nó là. biến = iterable_name. đếm ('giá trị')

Điều này trả về số lượng của phần tử được chỉ định trong iterable. Bạn có thể sử dụng phương thức đếm với khả năng hiểu danh sách để đếm số lần xuất hiện của từng nguyên âm trong chuỗi

Hãy nhìn vào đoạn mã dưới đây

Number of vowels in the given string is:  12
1

 

đầu ra

Number of vowels in the given string is:  12
2

 

Lưu ý rằng các nguyên âm (danh sách) giữ số lượng của mỗi nguyên âm trong chuỗi theo trình tự đã cho (aeiou)

Phần kết luận

Trong bài viết trên, bạn đã học cách đếm số nguyên âm trong một chuỗi trong Python. Lưu ý rằng vì tôi chỉ sử dụng các nguyên âm viết thường ('aeiou') trong các ví dụ trên, đoạn mã trên sẽ không xem xét các bảng chữ cái viết hoa ('AEIOU') trong khi đếm các nguyên âm

Bạn sẽ cần đề cập riêng đến các nguyên âm viết hoa ('AEIOU') để chúng cũng được tính. Bạn có thể sử dụng hàm chữ thường () hoặc chữ hoa () trên chuỗi đã cho để chuyển đổi các chữ cái thành cùng một trường hợp, để có được kết quả hiệu quả hơn

Ngoài các phương pháp đã đề cập ở trên, bạn sẽ tìm thấy các phương pháp khác sẽ thực hiện nhiệm vụ cho bạn. Bạn sẽ phải tối ưu hóa mã và sử dụng phương pháp với thời gian phức tạp tối thiểu để có kết quả tốt hơn