У мене є два рядки, як
string1="abc def ghi"
і
string2="def ghi abc"
Як отримати, що ці два рядки однакові, не порушуючи слів?
У мене є два рядки, як
string1="abc def ghi"
і
string2="def ghi abc"
Як отримати, що ці два рядки однакові, не порушуючи слів?
Відповіді:
Здається, питання полягає не в рівності рядків, а в рівності множин . Ви можете порівняти їх таким чином, лише розділивши рядки та перетворивши їх у набори:
s1 = 'abc def ghi'
s2 = 'def ghi abc'
set1 = set(s1.split(' '))
set2 = set(s2.split(' '))
print set1 == set2
Результат буде
True
map
, оскільки ви можете нормалізувати регістр рядків перед розбиттям
Якщо ви хочете знати, чи рівні обидва рядки, ви можете просто зробити
print string1 == string2
Але якщо ви хочете дізнатись, чи мають вони обидва однаковий набір символів і чи трапляються вони однакову кількість разів, ви можете використовувати collections.Counter
, наприклад
>>> 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']
Для цього ви можете використовувати за замовчуванням difflib у python
from difflib import SequenceMatcher
def similar(a, b):
return SequenceMatcher(None, a, b).ratio()
потім викличте аналогічний () як
similar(string1, string2)
він поверне порівняння як, співвідношення> = поріг, щоб отримати результат збігу
Рівність у прямому порівнянні:
string1 = "sample"
string2 = "sample"
if string1 == string2 :
print("Strings are equal with text : ", string1," & " ,string2)
else :
print ("Strings are not equal")
Рівність у наборах символів:
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")
Я пропоную кілька рішень, і ви можете вибрати той, який відповідає вашим потребам:
1) Якщо вас стосуються лише символи, тобто однакові символи, які мають однакову частоту в обох рядках, тоді використовуйте:
''.join(sorted(string1)).strip() == ''.join(sorted(string2)).strip()
2) Якщо вас також турбує кількість пробілів (пробіли) в обох рядках, просто використовуйте такий фрагмент:
sorted(string1) == sorted(string2)
3) Якщо ви розглядаєте слова, але не впорядковуєте їх та перевіряєте, чи мають обидва рядки рівні частоти слів, незалежно від їх порядку / зустрічальності, тоді можете використовувати:
sorted(string1.split()) == sorted(string2.split())
4) Розширюючи вищезазначене, якщо вас не турбує підрахунок частоти, але вам просто потрібно переконатися, що обидва рядки містять однаковий набір слів, тоді ви можете використовувати наступне:
set(string1.split()) == set(string2.split())
collection.Counter
здається більш очевидним, ніж використанняsorted
Якщо вам просто потрібно перевірити, чи точно однакові два рядки,
text1 = 'apple'
text2 = 'apple'
text1 == text2
Результат буде
True
Якщо вам потрібен відповідний відсоток,
import difflib
text1 = 'Since 1958.'
text2 = 'Since 1958'
output = str(int(difflib.SequenceMatcher(None, text1, text2).ratio()*100))
Відповідний відсоток виходу буде,
'95'
Я думаю, що difflib - це хороша бібліотека для виконання цієї роботи
>>>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']
відкрийте обидва файли, а потім порівняйте їх, розділивши вміст його слів;
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
Якщо ви хочете отримати справді просту відповідь:
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")
Спробуйте приховати обидві рядки у верхній або нижній регістр. Тоді ви можете використовувати ==
оператор порівняння.
Це досить базовий приклад, але після логічних порівнянь (==) або string1.lower() == string2.lower()
, можливо, може бути корисно спробувати деякі основні метрики відстаней між двома рядками.
Ви можете всюди знайти приклади, пов'язані з тими чи іншими показниками, спробуйте також пакет fuzzywuzzy ( https://github.com/seatgeek/fuzzywuzzy ).
import Levenshtein
import difflib
print(Levenshtein.ratio('String1', 'String2'))
print(difflib.SequenceMatcher(None, 'String1', 'String2').ratio())
Ви можете використовувати прості цикли для перевірки рівності двох рядків. .Але в ідеалі ви можете використовувати щось на зразок 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