Làm cách nào để so sánh hai chuỗi trong python?


83

Tôi có hai chuỗi như

string1="abc def ghi"

string2="def ghi abc"

Làm thế nào để có được rằng hai chuỗi này giống nhau mà không bị vỡ các từ?


13
Ý bạn là gì 'giống nhau'? Định nghĩa của bạn về sự bình đẳng của các chuỗi là gì?
Theox

41
Hai chuỗi đó không giống nhau. Chuỗi thứ tự trong quan trọng là.
jonrsharpe

8
Nếu vấn đề của bạn được giải quyết, vui lòng đánh dấu bất kỳ câu trả lời nào là được chấp nhận
oxfn

Câu trả lời:


68

Có vẻ câu hỏi không phải là về bình đẳng chuỗi, mà là về bình đẳng đặt . Bạn có thể so sánh chúng theo cách này chỉ bởi chuỗi tách và chuyển đổi chúng sang bộ:

s1 = 'abc def ghi'
s2 = 'def ghi abc'
set1 = set(s1.split(' '))
set2 = set(s2.split(' '))
print set1 == set2

Kết quả sẽ là

True

1
Bỏ qua trường hợp bằng cách sử dụng lambda s1 = 'abc def ghi' s2 = 'def ghi Abc' set1 = set(map(lambda word: word.lower(),s1.split(' '))) set2 = set(map(lambda word: word.lower(),s2.split(' '))) print(set1 == set2) Demo
Abhijeet

@Abhijeet Không cần map, vì bạn có thể chuẩn hóa trường hợp chuỗi trước khi tách
oxfn

56

Nếu bạn muốn biết liệu cả hai chuỗi có bằng nhau hay không, bạn chỉ cần làm

print string1 == string2

Nhưng nếu bạn muốn biết liệu cả hai đều có cùng một bộ ký tự và chúng xuất hiện cùng một số lần, bạn có thể sử dụng collections.Counter, như thế này

>>> string1, string2 = "abc def ghi", "def ghi abc"
>>> from collections import Counter
>>> Counter(string1) == Counter(string2)
True

13
>>> s1="abc def ghi"
>>> s2="def ghi abc"
>>> s1 == s2  # For string comparison 
False
>>> sorted(list(s1)) == sorted(list(s2)) # For comparing if they have same characters. 
True
>>> sorted(list(s1))
[' ', ' ', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i']
>>> sorted(list(s2))
[' ', ' ', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i']

8

Một cái gì đó như thế này:

if string1 == string2:
    print 'they are the same'

cập nhật: nếu bạn muốn xem mỗi chuỗi con có thể tồn tại trong chuỗi kia hay không:

elem1 = [x for x in string1.split()]
elem2 = [x for x in string2.split()]

for item in elem1:
    if item in elem2:
        print item

8

Đối với điều đó, bạn có thể sử dụng difflib mặc định trong python

from difflib import SequenceMatcher

def similar(a, b):
    return SequenceMatcher(None, a, b).ratio()

sau đó gọi tương tự () là

similar(string1, string2)

nó sẽ trả về so sánh là, ratio> = ngưỡng để nhận kết quả đối sánh


8

Bình đẳng khi so sánh trực tiếp:

string1 = "sample"
string2 = "sample"

if string1 == string2 :
    print("Strings are equal with text : ", string1," & " ,string2)
else :
    print ("Strings are not equal")

Bình đẳng trong các bộ ký tự:

string1 = 'abc def ghi'
string2 = 'def ghi abc'

set1 = set(string1.split(' '))
set2 = set(string2.split(' '))

print set1 == set2

if string1 == string2 :
    print("Strings are equal with text : ", string1," & " ,string2)
else :
    print ("Strings are not equal")

5

Tôi sẽ cung cấp một số giải pháp và bạn có thể chọn giải pháp đáp ứng nhu cầu của mình:

1) Nếu bạn chỉ quan tâm đến các ký tự, tức là các ký tự giống nhau và có tần số bằng nhau của mỗi ký tự trong cả hai chuỗi, thì hãy sử dụng:

''.join(sorted(string1)).strip() == ''.join(sorted(string2)).strip()

2) Nếu bạn cũng quan tâm đến số lượng khoảng trắng (ký tự khoảng trắng) trong cả hai chuỗi, thì chỉ cần sử dụng đoạn mã sau:

sorted(string1) == sorted(string2)

3) Nếu bạn đang xem xét các từ nhưng không phải thứ tự của chúng và kiểm tra xem cả hai chuỗi có tần số từ bằng nhau hay không, bất kể thứ tự / lần xuất hiện của chúng, thì có thể sử dụng:

sorted(string1.split()) == sorted(string2.split())

4) Mở rộng ở trên, nếu bạn không quan tâm đến số lượng tần suất, nhưng chỉ cần đảm bảo rằng cả hai chuỗi chứa cùng một tập hợp từ, thì bạn có thể sử dụng như sau:

set(string1.split()) == set(string2.split())

Đối với việc sử dụng 3 trường hợp collection.Counter dường như rõ ràng hơn so với sử dụngsorted
Grijesh Chauhan

4

Nếu bạn chỉ cần kiểm tra xem hai chuỗi có hoàn toàn giống nhau hay không,

text1 = 'apple'

text2 = 'apple'

text1 == text2

Kết quả sẽ là

True

Nếu bạn cần tỷ lệ phần trăm phù hợp,

import difflib

text1 = 'Since 1958.'

text2 = 'Since 1958'

output = str(int(difflib.SequenceMatcher(None, text1, text2).ratio()*100))

Sản lượng phần trăm phù hợp sẽ là,

'95'

3

Tôi nghĩ difflib là một thư viện tốt để làm công việc này

   >>>import difflib 
   >>> diff = difflib.Differ()
   >>> a='he is going home'
   >>> b='he is goes home'
   >>> list(diff.compare(a,b))
     ['  h', '  e', '   ', '  i', '  s', '   ', '  g', '  o', '+ e', '+ s', '- i', '- n', '- g', '   ', '  h', '  o', '  m', '  e']
    >>> list(diff.compare(a.split(),b.split()))
      ['  he', '  is', '- going', '+ goes', '  home']

1

mở cả hai tệp sau đó so sánh chúng bằng cách tách nội dung từ của nó;

log_file_A='file_A.txt'

log_file_B='file_B.txt'

read_A=open(log_file_A,'r')
read_A=read_A.read()
print read_A

read_B=open(log_file_B,'r')
read_B=read_B.read()
print read_B

File_A_set = set(read_A.split(' '))
File_A_set = set(read_B.split(' '))
print File_A_set == File_B_set

1

Nếu bạn muốn một câu trả lời thực sự đơn giản:

s_1 = "abc def ghi"
s_2 = "def ghi abc"
flag = 0
for i in s_1:
    if i not in s_2:
        flag = 1
if flag == 0:
    print("a == b")
else:
    print("a != b")

2
Sử dụng toán tử '==' là câu trả lời khá dễ dàng và chính xác ở đây.
HaseeB Mir

1
@HaSeeBMiR và = :)!
committedandroider

0

Cố gắng giấu cả hai chuỗi thành chữ hoa hoặc chữ thường. Sau đó, bạn có thể sử dụng ==toán tử so sánh.


0

Đây là một ví dụ khá cơ bản, nhưng sau khi so sánh logic (==) hoặc string1.lower() == string2.lower(), có thể hữu ích để thử một số số liệu cơ bản về khoảng cách giữa hai chuỗi.

Bạn có thể tìm thấy các ví dụ ở khắp mọi nơi liên quan đến các chỉ số này hoặc một số số liệu khác, cũng có thể thử gói mờwuzzy ( https://github.com/seatgeek/fuzzywuzzy ).

import Levenshtein
import difflib

print(Levenshtein.ratio('String1', 'String2'))
print(difflib.SequenceMatcher(None, 'String1', 'String2').ratio())

-3

Bạn có thể sử dụng các vòng lặp đơn giản để kiểm tra hai chuỗi có bằng nhau. .Nhưng lý tưởng nhất là bạn có thể sử dụng một cái gì đó như return s1 == s2

s1 = 'hello'
s2 = 'hello'

a = []
for ele in s1:
    a.append(ele)
for i in range(len(s2)):
    if a[i]==s2[i]:
        a.pop()
if len(a)>0:
    return False
else:
    return True
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.