Hoe vergelijk ik twee strings in python?

Ik heb twee strings zoals

string1="abc def ghi"

en

string2="def ghi abc"

Hoe zorg je ervoor dat deze twee strings hetzelfde zijn zonder de woorden te breken?


Antwoord 1, autoriteit 100%

Het lijkt erop dat de vraag niet gaat over strings-gelijkheid, maar over sets-gelijkheid. Je kunt ze op deze manier alleenvergelijken door strings te splitsen en ze om te zetten in sets:

s1 = 'abc def ghi'
s2 = 'def ghi abc'
set1 = set(s1.split(' '))
set2 = set(s2.split(' '))
print set1 == set2

Het resultaat zal zijn

True

Antwoord 2, autoriteit 91%

Als je wilt weten of beide strings gelijk zijn, kun je dat gewoon doen

print string1 == string2

Maar als je wilt weten of ze allebei dezelfde set tekens hebben en hetzelfde aantal keren voorkomen, kun je collections.Counter, zoals dit

>>> string1, string2 = "abc def ghi", "def ghi abc"
>>> from collections import Counter
>>> Counter(string1) == Counter(string2)
True

Antwoord 3, autoriteit 19%

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

Antwoord 4, Autoriteit 13%

Gelijkheid in directe vergelijking:

string1 = "sample"
string2 = "sample"
if string1 == string2 :
    print("Strings are equal with text : ", string1," & " ,string2)
else :
    print ("Strings are not equal")

Gelijkheid in tekensets:

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

Antwoord 5, Autoriteit 12%

zoiets:

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

Update: Als u wilt zien of elke substring in het andere kan bestaan:

elem1 = [x for x in string1.split()]
elem2 = [x for x in string2.split()]
for item in elem1:
    if item in elem2:
        print item

Antwoord 6, Autoriteit 12%

Daarvoor kunt u standaard difflib in Python gebruiken

from difflib import SequenceMatcher
def similar(a, b):
    return SequenceMatcher(None, a, b).ratio()

bel dan vergelijkbaar () als

similar(string1, string2)

het zal vergelijken als ,ratio >= drempelwaarde geven om een overeenkomstresultaat te krijgen


Antwoord 7, autoriteit 9%

Als je alleen wilt controleren of de twee strings precies hetzelfde zijn,

text1 = 'apple'
text2 = 'apple'
text1 == text2

Het resultaat is

True

Als u het overeenkomende percentage nodig heeft,

import difflib
text1 = 'Since 1958.'
text2 = 'Since 1958'
output = str(int(difflib.SequenceMatcher(None, text1, text2).ratio()*100))

Overeenkomende procentuele output zal zijn,

'95'

Antwoord 8, autoriteit 7%

Ik ga verschillende oplossingen bieden en u kunt degene kiezen die aan uw behoeften voldoet:

1) Als u zich alleen bezighoudt met de karakters, d.w.z. dezelfde karakters en met gelijke frequenties van elk in beide strings, gebruik dan:

''.join(sorted(string1)).strip() == ''.join(sorted(string2)).strip()

2) Als u zich ook zorgen maakt over het aantal spaties (witruimtetekens) in beide strings, gebruik dan gewoon het volgende fragment:

sorted(string1) == sorted(string2)

3) Als u woorden overweegt maar niet hun volgorde en controleert of beide strings gelijke frequenties van woorden hebben, ongeacht hun volgorde/voorkomen, gebruik dan:

sorted(string1.split()) == sorted(string2.split())

4) Om het bovenstaande uit te breiden, als u zich niet druk maakt over het aantal frequenties, maar er alleen voor moet zorgen dat beide strings dezelfde setwoorden bevatten, dan kun je het volgende gebruiken:

set(string1.split()) == set(string2.split())

Antwoord 9, autoriteit 4%

Ik denk dat difflib een goede bibliotheek is om dit werk te doen

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

Antwoord 10

open beide bestanden
vergelijk ze vervolgens door de woordinhoud te splitsen;

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

Antwoord 11

Als je een heel eenvoudig antwoord wilt:

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

Antwoord 12

Probeer zowel strings naar boven of kleine letters te verbergen. Dan kunt u ==Vergelijkingsoperator gebruiken.


Antwoord 13

Dit is een vrij basisvoorbeeld, maar na de logische vergelijkingen (==) of string1.lower() == string2.lower(), misschien nuttig zijn om een ​​deel van de basis te proberen metrics van afstanden tussen twee snaren.

U kunt overal voorbeelden vinden met betrekking tot deze of een aantal andere metrics, probeer ook het Fuzzywuzzy-pakket (https: // github.com/seatgeek/fuzzywuzzy ).

import Levenshtein
import difflib
print(Levenshtein.ratio('String1', 'String2'))
print(difflib.SequenceMatcher(None, 'String1', 'String2').ratio())

Antwoord 14

U kunt eenvoudige lussen gebruiken om twee snaren te controleren zijn gelijk. .Maar idealiter kunt u iets gebruiken als retourneer 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

Other episodes