Mam dwa takie struny
string1="abc def ghi"
i
string2="def ghi abc"
Jak sprawić, by te dwa ciągi były takie same bez łamania słów?
Mam dwa takie struny
string1="abc def ghi"
i
string2="def ghi abc"
Jak sprawić, by te dwa ciągi były takie same bez łamania słów?
Odpowiedzi:
Wydaje się, że pytanie nie dotyczy równości łańcuchów, ale równości zbiorów . Możesz je porównać tylko w ten sposób , dzieląc ciągi i konwertując je na zestawy:
s1 = 'abc def ghi'
s2 = 'def ghi abc'
set1 = set(s1.split(' '))
set2 = set(s2.split(' '))
print set1 == set2
Wynik będzie
True
map
, jak można znormalizować łańcuchy sprawę podziału
Jeśli chcesz wiedzieć, czy oba ciągi są równe, możesz po prostu to zrobić
print string1 == string2
Ale jeśli chcesz wiedzieć, czy oba mają ten sam zestaw znaków i występują one taką samą liczbę razy, możesz użyć w collections.Counter
ten sposób
>>> 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']
W tym celu możesz użyć domyślnego difflib w Pythonie
from difflib import SequenceMatcher
def similar(a, b):
return SequenceMatcher(None, a, b).ratio()
następnie wywołaj podobne () jako
similar(string1, string2)
zwróci porównanie jako, stosunek> = próg, aby uzyskać wynik dopasowania
Równość w bezpośrednim porównywaniu:
string1 = "sample"
string2 = "sample"
if string1 == string2 :
print("Strings are equal with text : ", string1," & " ,string2)
else :
print ("Strings are not equal")
Równość w zestawach znaków:
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")
Mam zamiar przedstawić kilka rozwiązań i możesz wybrać to, które spełnia Twoje potrzeby:
1) Jeśli interesują cię tylko znaki, tj. Te same znaki i mające równe częstotliwości każdego z nich w obu łańcuchach, użyj:
''.join(sorted(string1)).strip() == ''.join(sorted(string2)).strip()
2) Jeśli interesuje Cię również liczba spacji (białych znaków) w obu ciągach, po prostu użyj następującego fragmentu:
sorted(string1) == sorted(string2)
3) Jeśli rozważasz słowa, ale nie ich kolejność i sprawdzasz, czy oba ciągi mają równe częstotliwości słów, niezależnie od ich kolejności / występowania, możesz użyć:
sorted(string1.split()) == sorted(string2.split())
4) Rozszerzając powyższe, jeśli nie jesteś zainteresowany liczbą częstotliwości, ale po prostu musisz upewnić się, że oba ciągi zawierają ten sam zestaw słów, możesz użyć następującego:
set(string1.split()) == set(string2.split())
collection.Counter
wydaje się bardziej oczywisty niż użyciesorted
Jeśli chcesz tylko sprawdzić, czy dwa ciągi są dokładnie takie same,
text1 = 'apple'
text2 = 'apple'
text1 == text2
Wynik będzie
True
Jeśli potrzebujesz odpowiedniego odsetka,
import difflib
text1 = 'Since 1958.'
text2 = 'Since 1958'
output = str(int(difflib.SequenceMatcher(None, text1, text2).ratio()*100))
Odpowiedni procent wyjściowy będzie:
'95'
Myślę, że difflib to dobra biblioteka do wykonywania tej pracy
>>>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']
otwórz oba pliki, a następnie porównaj je, dzieląc zawartość słów;
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
Jeśli chcesz naprawdę prostej odpowiedzi:
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")
Spróbuj zamienić oba ciągi na wielkie lub małe litery. Następnie możesz użyć ==
operatora porównania.
To jest dość podstawowy przykład, ale po logicznych porównaniach (==) lub string1.lower() == string2.lower()
, być może, może przydać się wypróbowanie niektórych podstawowych wskaźników odległości między dwoma ciągami.
Możesz znaleźć wszędzie przykłady związane z tymi lub innymi metrykami, wypróbuj także pakiet fuzzywuzzy ( https://github.com/seatgeek/fuzzywuzzy ).
import Levenshtein
import difflib
print(Levenshtein.ratio('String1', 'String2'))
print(difflib.SequenceMatcher(None, 'String1', 'String2').ratio())
Możesz użyć prostych pętli, aby sprawdzić, czy dwa ciągi są równe. Ale idealnie możesz użyć czegoś takiego jak 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