Ich habe zwei Saiten wie
string1="abc def ghi"
und
string2="def ghi abc"
Wie kann man erreichen, dass diese beiden Zeichenfolgen gleich sind, ohne die Wörter zu brechen?
Ich habe zwei Saiten wie
string1="abc def ghi"
und
string2="def ghi abc"
Wie kann man erreichen, dass diese beiden Zeichenfolgen gleich sind, ohne die Wörter zu brechen?
Antworten:
Anscheinend geht es bei der Frage nicht um die Gleichheit der Zeichenfolgen, sondern um die Gleichheit der Mengen . Sie können sie auf diese Weise vergleichen , nur durch die Spaltung von Streichern und sie setzt Umwandlung:
s1 = 'abc def ghi'
s2 = 'def ghi abc'
set1 = set(s1.split(' '))
set2 = set(s2.split(' '))
print set1 == set2
Ergebnis wird sein
True
map
, da Sie die Zeichenfolge vor dem Teilen normalisieren können
Wenn Sie wissen möchten, ob beide Zeichenfolgen gleich sind, können Sie dies einfach tun
print string1 == string2
Aber wenn Sie wissen wollen , ob sie beide den gleichen Satz von Zeichen haben und sie treten gleich oft, können Sie verwenden collections.Counter
, wie dies
>>> 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']
Gleichheit im direkten Vergleich:
string1 = "sample"
string2 = "sample"
if string1 == string2 :
print("Strings are equal with text : ", string1," & " ,string2)
else :
print ("Strings are not equal")
Gleichheit in Zeichensätzen:
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")
Dafür können Sie Standard-Difflib in Python verwenden
from difflib import SequenceMatcher
def similar(a, b):
return SequenceMatcher(None, a, b).ratio()
Rufen Sie dann ähnlich () auf wie
similar(string1, string2)
Es wird "Vergleichen>" zurückgegeben, Verhältnis> = Schwellenwert, um das Übereinstimmungsergebnis zu erhalten
Ich werde verschiedene Lösungen anbieten, und Sie können die auswählen, die Ihren Anforderungen entspricht:
1) Wenn Sie sich nur mit den Zeichen befassen, dh mit denselben Zeichen und mit jeweils gleichen Häufigkeiten in beiden Zeichenfolgen, verwenden Sie:
''.join(sorted(string1)).strip() == ''.join(sorted(string2)).strip()
2) Wenn Sie sich auch mit der Anzahl der Leerzeichen (Leerzeichen) in beiden Zeichenfolgen befassen, verwenden Sie einfach das folgende Snippet:
sorted(string1) == sorted(string2)
3) Wenn Sie Wörter berücksichtigen, aber nicht deren Reihenfolge und prüfen, ob beide Zeichenfolgen unabhängig von ihrer Reihenfolge / ihrem Auftreten die gleiche Häufigkeit von Wörtern haben, können Sie Folgendes verwenden:
sorted(string1.split()) == sorted(string2.split())
4) Erweitern Sie das Obige. Wenn Sie sich nicht mit der Häufigkeit befassen, sondern nur sicherstellen müssen, dass beide Zeichenfolgen denselben Satz von Wörtern enthalten, können Sie Folgendes verwenden:
set(string1.split()) == set(string2.split())
collection.Counter
scheint offensichtlicher als die Verwendungsorted
Wenn Sie nur überprüfen müssen, ob die beiden Zeichenfolgen genau gleich sind,
text1 = 'apple'
text2 = 'apple'
text1 == text2
Das Ergebnis wird sein
True
Wenn Sie den passenden Prozentsatz benötigen,
import difflib
text1 = 'Since 1958.'
text2 = 'Since 1958'
output = str(int(difflib.SequenceMatcher(None, text1, text2).ratio()*100))
Passende prozentuale Ausgabe wird sein,
'95'
Ich denke, Difflib ist eine gute Bibliothek, um diesen Job zu erledigen
>>>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']
Öffnen Sie beide Dateien und vergleichen Sie sie, indem Sie den Wortinhalt aufteilen.
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
Wenn Sie eine wirklich einfache Antwort wünschen:
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")
Versuchen Sie, beide Zeichenfolgen in Groß- oder Kleinbuchstaben umzuwandeln. Dann können Sie den ==
Vergleichsoperator verwenden.
Dies ist ein ziemlich einfaches Beispiel, aber nach den logischen Vergleichen (==) oder string1.lower() == string2.lower()
kann es nützlich sein, einige der grundlegenden Metriken für Abstände zwischen zwei Zeichenfolgen auszuprobieren.
Sie können überall Beispiele finden, die sich auf diese oder einige andere Metriken beziehen. Probieren Sie auch das Fuzzywuzzy-Paket ( https://github.com/seatgeek/fuzzywuzzy ).
import Levenshtein
import difflib
print(Levenshtein.ratio('String1', 'String2'))
print(difflib.SequenceMatcher(None, 'String1', 'String2').ratio())
Sie können einfache Schleifen verwenden, um zu überprüfen, ob zwei Zeichenfolgen gleich sind. Aber im Idealfall können Sie so etwas wie return s1 == s2 verwenden
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