Tôi có hai chuỗi như
string1="abc def ghi"
và
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ừ?
Tôi có hai chuỗi như
string1="abc def ghi"
và
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ừ?
Câu trả lời:
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
map
, vì bạn có thể chuẩn hóa trường hợp chuỗi trước khi tách
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
>>> 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']
Đố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
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")
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())
collection.Counter
dường như rõ ràng hơn so với sử dụngsorted
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'
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']
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
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")
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.
Đâ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())
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