Wie vergleiche ich zwei Zeichenfolgen in Python?


83

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?


13
Was meinst du mit "sind gleich"? Was ist Ihre Definition der Gleichheit von Zeichenfolgen?
Theox

41
Diese beiden Saiten sind nicht gleich. Reihenfolge Zeichenfolgen in wichtig ist.
Jonrsharpe

8
Wenn Ihr Problem gelöst ist, markieren Sie bitte jede Antwort als akzeptiert
oxfn

Antworten:


68

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

1
Ignorieren Sie den Fall mit 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 Es besteht keine Notwendigkeit map, da Sie die Zeichenfolge vor dem Teilen normalisieren können
oxfn

56

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

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

Etwas wie das:

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

Update: Wenn Sie sehen möchten, ob jede Unterzeichenfolge in der anderen vorhanden sein kann:

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

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")

7

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


5

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())

Für den 3. Anwendungsfall collection.Counter scheint offensichtlicher als die Verwendungsorted
Grijesh Chauhan

4

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'

3

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']

1

Ö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

1

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")

2
Die Verwendung des Operators '==' ist hier ziemlich einfach und korrekt.
HaseeB Mir

1
@HaSeeBMiR und = :)!
committedandroider

0

Versuchen Sie, beide Zeichenfolgen in Groß- oder Kleinbuchstaben umzuwandeln. Dann können Sie den ==Vergleichsoperator verwenden.


0

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())

-3

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.