So sánh chuỗi trong python | Laptrinhcanban.com

So sánh chuỗi trong python

Hướng dẫn cách so sánh 2 chuỗi trong python. Bạn sẽ học tất cả các cách so sánh 2 chuỗi trong python sau bài học này.

Chúng ta có 7 phương pháp để so sánh 2 chuỗi trong python như sau:

  • Toán tử ==, !=: so sánh và kiểm tra hai chuỗi có giống nhau trong Python
  • Toán tử <, <=, >, >=: so sánh lớn nhỏ giữa 2 chuỗi trong python
  • Toán tử in, not in : so sánh khớp một phần và kiểm tra một chuỗi có nằm trong chuỗi khác trong Python.
  • Phương thức startswith(), endswith(): so sánh đầu cuối và kiểm tra một chuỗi có bắt đầu hoặc kết thúc bằng một chuỗi chỉ định
  • Phương thưc upper, lower(): so sánh hai chuỗi mà không phân biết ký tự chữ thường chữ hoa trong chuỗi
  • Hàm set(): so sánh 2 chuỗi và lấy ra các phần tử giống nhau trong python
  • Hàm set(): so sánh 2 chuỗi và lấy ra các phần tử khác nhau trong python

So sánh đồng nhất và kiểm tra hai chuỗi có giống nhau trong Python | toán tử == và !=

Để kiểm tra hai chuỗi có giống nhau trong Python, chúng ta sử dụng toán tử so sánh bằng ==, và nếu như toàn bộ giá trị của các phần tử trong hai chuỗi đều giống nhau, giá trị True được trả về. Ví dụ:

print('abc' == 'abc')
##> True

print('abc' == 'def')
##> False

Tương tự chúng ta sử dụng toán tử so sánh khác != để kiểm tra hai chuỗi có khác nhau trong Python như sau:

print('abc' != 'abc')
##> False

print('abc' != 'def')
##> True

Lại nữa, các phép so sánh chuỗi bao gồm cả so sánh đồng nhất sẽ phân biệt chữ hoa và chữ thường trong chuỗi. Nếu hai chuỗi giống nhau về ký tự nhưng khác nhau về ký tự chữ hoa chữ thường thì cũng không được coi là giống nhau.

print('abc' == 'ABC')
##> False

print('abc' != 'ABC')
##> True

Thứ tự của các ký tự trong chuỗi cũng được xem xét khi đem đi so sánh. Nếu hai chuỗi giống nhau về ký tự nhưng khác nhau về thứ tự các ký tự trong chuỗi thì cũng không được coi là giống nhau.

print('abc' == 'cab')
##> False

print('abc' != 'bac')
##> True

Nếu bạn muốn so sánh hai chuỗi mà không phân biết ký tự chữ thường chữ hoa trong chuỗi, hãy xem tiếp ở phần sau.

So sánh lớn nhỏ giữa 2 chuỗi trong python | toán tử <, <=, >, >=

Chúng ta sử dụng các toán tử so sánh như <, <=, >, >= để tìm mối quan hệ lớn nhỏ giữa 2 chuỗi trong python. Và phần tử đầu tiên có giá trị khác nhau giữa 2 chuỗi sẽ được lấy ra để so sánh.

Ví dụ:

print('a' < 'b')
#>> True

print('aa' <= 'ab')
#>> True

print('abc' > 'abcd')
#>> False

print('abc' >= 'abcd')
#>> False

Khác với so sánh số trong python, chúng ta không thể sử dụng trực tiếp giá trị của chuỗi để so sánh lớn nhỏ giữa chuỗi trong python. Thay vào đó, chúng ta sử dụng các điểm mã unicode (unicode code point) của các ký tự trong chuỗi để so sánh.

Để kiểm tra điểm mã Unicode của một ký tự, chúng ta sử dụng tới hàm ord() trong python như sau:

print(ord("a"))
#> 97
print(ord("b"))
#> 98
print(ord("A"))
#> 65

Khi so sánh lớn nhỏ hai ký tự đơn, chúng ta đơn giản so sánh điểm mã unicode của chúng. Ví dụ, do điểm mã unicode của ký tự a là 97 sẽ lớn hơn của ký tự A à 65 nên phép so sánh sau sẽ cho ra kết quả True:

print( "a" > "A")
#>True

Tuy nhiên khi so sánh 2 chuỗi ký tự với nhau, chúng ta không thể đơn thuần so sánh các điểm mã unicode của từng ký tự được. Lúc này, phép so sánh sẽ bắt đầu từ ký tự đầu tiên trong hai chuỗi, và nếu chúng giống nhau, các ký tự tiếp theo được so sánh cho tới khi xuất hiện một ký tự khác nhau đầu tiên trong hai chuỗi. Khi đó, điểm mã unicode của ký tự này sẽ đại diện cho cả chuỗi và được dùng để so sánh lớn nhỏ. Ví dụ:

print( "aAaaaaa" < "aaa")
#>> True
print( "a" > "Aaaa")
#>> True

Ở ví dụ 1, ký tự khác nhau đầu tiên trong hai chuỗi là A và a, do đó mặc dù chuỗi bên trái nhiều ký tự hơn chuỗi bên phải nhưng điểm mã unicode của A lại nhỏ hơn a, do đó chuỗi bên trái sẽ nhỏ hơn chuỗi bên phải.
Tương tự ở ví dụ 2, mặc dù chuỗi bên trái chỉ gồm 1 ký tự, nhưng điểm mã unicode của a lại lớn hơn A, kết quả là chuỗi bên trái sẽ lớn hơn chuỗi bên phải.

Một điều đặc biệt khi so sánh lớn nhỏ giữa 2 chuỗi trong python là, các ký tự viết hoa sẽ LUÔN nhỏ hơn các ký tự chữ thường.

print('Z' < 'z')
# True

print('Z' < 'b')
# True

print('B' < 'b')
# True

print('A' < 'b')
# True

Do đó trong trường hợp này chúng ta không cần phải dùng hàm ord() để tìm điểm mã unicode của ký tự nữa, mà có thể dùng quy luật ở trên để so sánh lớn nhỏ giữa ký tự viết thường và viết hoa trong Python.

So sánh khớp một phần và kiểm tra một chuỗi có nằm trong chuỗi khác trong Python | toán tử in và not in

Chúng ta sử dụng các toán tử innot in để so sánh khớp một phần và kiểm tra một chuỗi có nằm trong chuỗi khác trong Python.

Ví dụ để kiểm tra chuỗi x có nằm trong y hay không, chúng ta viết x in y, và nếu x có nằm trong y thì kết quả True, và nếu x không nằm trong y thì kết quả False sẽ trả về.

Ví dụ:

print('cc' in 'bb-cc-dd')
#>> True

print('1' in '234')
#>> False

Ngược lại với toán tử in, chúng ta dùng toán tử not in để kiểm tra một chuỗi có KHÔNG nằm trong chuỗi khác hay không. Ví dụ để kiểm tra chuỗi x có không nằm trong y hay không, chúng ta viết x not in y, và nếu x có nằm trong y thì kết quả False, và nếu x không nằm trong y thì kết quả True sẽ trả về.
Ví dụ:

print('cc' not in 'bb-cc-dd')
#>> False

print('1' not in '234')
#>> True

Chúng ta hay sử dụng toán tử kiểm tra một chuỗi có nằm trong chuỗi khác trong các biểu thức điều kiện của lệnh if hoặc vòng lặp for.
Ví dụ, chúng ta viết một chương trình xóa ảnh JPG hoặc PNG từ trong một thư mục. Bằng cách lấy đuôi file và kiểm tra đuôi file có chứa chuỗi JPG hoặc PNG hay không, chúng ta có thể xác định và xóa đi các file ảnh trong thư mục chỉ định như sau:

import os

duoi_file = "JPG_PNG"
src = "data/picture"
for file in os.listdir(src):
file_ext = os.path.splitext(file)
if file_ext in duoi_file:
os.remove(os.path.join(src, file))

So sánh đầu cuối và kiểm tra một chuỗi có bắt đầu hoặc kết thúc bằng một chuỗi chỉ định | startswith(), endswith() trong Python

Chúng ta sử dụng các phương thức startswith(), endswith() để so sánh đầu hoặc cuối chuỗi và kiểm tra một chuỗi có bắt đầu hoặc kết thúc bằng một chuỗi khác hay không trong Python.

Trường hợp bạn muốn kiểm tra một chuỗi có bắt đầu bằng một chuỗi ký tự chỉ định hay không, hãy dùng phương thức startswith() trong Python như ví dụ sau:

s = 'aaa-bbb-ccc'

print(s.startswith('aaa'))
##> True

print(s.startswith('bbb'))
#>> False

Ngược lại, nếu bạn muốn kiểm tra một chuỗi có bắt đầu bằng một chuỗi ký tự chỉ định hay không, hãy dùng phương thức endswith() trong Python như ví dụ sau:

s = 'aaa-bbb-ccc'

print(s.endswith('ccc'))
##> True

print(s.endswith('bbb'))
#>> False

Lại nữa, chúng ta có thể chỉ định một tuple chứa các chuỗi ký tự, và sau đó kiểm tra xem chuỗi ban đầu có bắt đầu hoặc kết thúc bằng một trong các chuỗi ký tự trong tuple đó hay không. Nếu như không có chuỗi nào khớp thì kết quả False và ngược lại chỉ cần một chuỗi trong tuple khớp thì kết quả True được trả về. Ví dụ:

s  =  'aaa-bbb-ccc' 
t = ('aaa' , 'bbb')

print( s.startswith(t))
##> True

print( s.endswith(t))
#>> False

So sánh hai chuỗi mà không phân biết ký tự chữ thường chữ hoa trong chuỗi | upper(), lower()

Trong các phương pháp so sánh chuỗi mà Kiyoshi đã giới thiệu ở trên đều có một điểm chung là có sự phân biệt rõ ràng giữa ký tự chữ thường và chữ hoa khi so sánh chuỗi.

Nếu bạn không muốn phân biệt chữ thường chữ hoa khi so sánh chuỗi trong python, hãy chuyển đổi cả hai chuỗi ban đầu về dạng chữ hoa, hoặc chữ thường trước khi đem so sánh chúng.

Lúc này, chúng ta sẽ cần sử dụng tới hai phương thức chuyển đổi chữ hoa chữ thường trong python là upper(), lower() trong python.

Ví dụ, chúng ta chuyển hai chuỗi ban đầu về dạng chữ hoa và đem so sánh chúng, bằng cách dùng lower() như sau:

s1 = 'abcd1'
s2 = 'ABCD1'

print(s1 == s2)
#>> False

print(s1.lower() == s2.lower())
#>> True

Tương tự như khi chúng ta sử dụng phương thức uppper():

s1 = 'abcd1'
s2 = 'ABCD1'

print(s1 == s2)
#>> False

print(s1.uppper() == s2.uppper())
#>> True

So sánh 2 chuỗi và lấy ra các phần tử giống nhau trong python | set()

Trong python không có một hàm hay phương thức nào giúp chúng ta có thể so sánh trực tiếp và lấy ra các phần tử giống nhau giữa hai chuỗi cả.

Để so sánh 2 chuỗi trong python và lấy các phần tử giống nhau, chúng ta cần chuyển 2 chuỗi đã cho về kiểu set (tập hợp), sau đó mới tìm ra phần tử giống nhau giữa chúng thông qua phép tìm giao hai tập hợp bằng toán tử & trong python.

Việc chuyển chuỗi về kiểu set còn có một tác dụng nữa là giúp chúng ta xóa các phần tử trùng nhau trong chuỗi python trước khi đem chúng đi so sánh.

Sau đây, chúng ta sẽ xem ví dụ cụ thể về so sánh 2 chuỗi trong python và lấy các phần tử giống nhau giữa chúng như sau:

s1 = 'abcde'
s2 = 'cde'
s3 = 'abcdef'

print( set(s1) & set(s2) )
#>> {'e', 'd', 'c'}

print( set(s1) & set(s3) )
#>> {'d', 'b', 'e', 'c', 'a'}

print(type(set(s1) & set(s3)))
#>> <class 'set'>

Sau khi thu về set kết quả chứa các phần tử giống nhau giữa 2 chuỗi đã cho, chúng ta có thể dùng vòng lặp for để lấy ra các phần tử trong set kết quả. Lưu ý là do trong set không tồn tại index nên thứ tự lấy các phần tử và in ra màn hình có thể khác nhau trong các lần thực thi.

s1 = 'abcde'
s2 = 'cde'

common_s = set (s1) & set(s2)
for i in common_s:
print(i)
#>> e
#>> c
#>> d

Chúng ta cũng có thể tìm số phần tử trùng nhau giữa 2 chuỗi python bằng cách sử dụng hàm len() để đếm số phần tử trong set kết quả thu về. Ví dụ:

s1 = 'abcde'
s2 = 'cde'
commmon_count = len( set(s1) & set(s2) )
print(commmon_count)
#>> 3

Bạn cũng có thể chuyển set kết quả về kiểu list và thu về một list mới chứa các phần tử khác nhau trong 2 chuỗi ban đầu bằng cách sử dụng hàm list() trong python như ví dụ sau:

s1 = 'abcde'
s2 = 'cde'

common_l = list( set (s1) & set(s2) )

print(common_l[2])
#>> d

Tương tự khi so sánh 2 chuỗi, bạn cũng có thể so sánh 3 chuỗi hay nhiều chuỗi với nhau và tìm ra các phần tử giống nhau trong python như sau:

s1 = 'abcde'
s2 = 'cde'
s3 = 'abcdef'

s1_s2_s3 = set(s1) & set(s2) & set(s3)
print(s1_s2_s3)
#>> {'e', 'd', 'c'}

So sánh 2 chuỗi và lấy ra các phần tử khác nhau trong python | set()

Trong python không có một hàm hay phương thức nào giúp chúng ta có thể so sánh trực tiếp và lấy ra các phần tử khác nhau giữa hai chuỗi cả.

Để so sánh 2 chuỗi trong python và lấy các phần tử khác nhau, chúng ta cần chuyển 2 chuỗi đã cho về kiểu set (tập hợp), sau đó mới tìm ra phần tử khác nhau giữa chúng thông qua phép tìm phần bù giữa hai tập hợp bằng toán tử ^ trong python.

Việc chuyển chuỗi về kiểu set còn có một tác dụng nữa là giúp chúng ta xóa các phần tử trùng nhau trong chuỗi python trước khi đem chúng đi so sánh.

Sau đây, chúng ta sẽ xem ví dụ cụ thể về so sánh 2 chuỗi trong python và lấy các phần tử khác nhau giữa chúng như sau:

s1 = 'abcde'
s2 = 'cde'
s3 = 'abcdef'

print( set(s1) ^ set(s2) )
#>> {'b', 'a'}

print( set(s1) ^ set(s3) )
#>> {'f'}

print(type(set(s1) ^ set(s3)))
#>> <class 'set'>

Sau khi thu về set kết quả chứa các phần tử khác nhau giữa 2 chuỗi đã cho, chúng ta có thể dùng vòng lặp for để lấy ra các phần tử trong set kết quả. Lưu ý là do trong set không tồn tại index nên thứ tự lấy các phần tử và in ra màn hình có thể khác nhau trong các lần thực thi.

s1 = 'abcde'
s2 = 'cde'

common_s = set (s1) ^ set(s2)
for i in common_s:
print(i)
#>> a
#>> b

Chúng ta cũng có thể tìm số phần tử khác nhau giữa 2 chuỗi python bằng cách sử dụng hàm len() để đếm số phần tử trong set kết quả thu về. Ví dụ:

s1 = 'abcde'
s2 = 'cde'
commmon_count = len( set(s1) ^ set(s2) )
print(commmon_count)
#>> 2

Bạn cũng có thể chuyển set kết quả về kiểu list và thu về một list mới chứa các phần tử khác nhau trong 2 chuỗi ban đầu bằng cách sử dụng hàm list() trong python như ví dụ sau:

s1 = 'abcde'
s2 = 'cde'
common_l = list( set (s1) ^ set(s2) )

print(common_l[1])
#>> b

Tổng kết

Trên đây Kiyoshi đã hướng dẫn bạn về cách so sánh chuỗi trong python rồi. Đây đều là các phương pháp hết sức cơ bản, nên bạn hãy thực hành và master chúng ngay nhé.

Ngoài các phương pháp cơ bản trên, chúng ta cũng còn một cách khác để so sánh chuỗi trong python, đó chính là sử dụng biểu thức chính quy (Regular expression) trong Python. Phần này hơi khó hiểu chút với các bạn mới bắt đầu, nên Kiyoshi mạn phép sẽ chia sẻ nó trong các bài viết khác nhé.

HOME>> >>

Profile
きよしです!笑

Tác giả : Kiyoshi (Chis Thanh)

Kiyoshi là một cựu du học sinh tại Nhật Bản. Sau khi tốt nghiệp đại học Toyama năm 2017, Kiyoshi hiện đang làm BrSE tại Tokyo, Nhật Bản.