Jak porównać dwa ciągi znaków w Pythonie?

86

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?

user3064366
źródło
13
Co masz na myśli mówiąc „są takie same”? Jaka jest Twoja definicja równości strun?
Theox,
41
Te dwie struny nie są takie same. Kolejność ciągów w ważne jest.
jonrsharpe
8
Jeśli problem został rozwiązany, zaznacz dowolną odpowiedź jako zaakceptowaną
oxfn

Odpowiedzi:

69

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
oxfn
źródło
1
Ignoruj ​​wielkość liter przy użyciu 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 Nie ma potrzeby się map, jak można znormalizować łańcuchy sprawę podziału
oxfn
57

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.Counterten sposób

>>> string1, string2 = "abc def ghi", "def ghi abc"
>>> from collections import Counter
>>> Counter(string1) == Counter(string2)
True
na czworo
źródło
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']
Tanveer Alam
źródło
8

Coś takiego:

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

aktualizacja: jeśli chcesz sprawdzić, czy każdy podciąg może istnieć w innym:

elem1 = [x for x in string1.split()]
elem2 = [x for x in string2.split()]

for item in elem1:
    if item in elem2:
        print item
philshem
źródło
8

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

Basil Jose
źródło
8

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")
AG
źródło
5

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())
Archit Kapoor
źródło
Trzeci przypadek użycia collection.Counter wydaje się bardziej oczywisty niż użyciesorted
Grijesh Chauhan
4

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'
arjun
źródło
3

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']
Asad
źródło
1

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
Anum Sheraz
źródło
1

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")
Baalateja Kataru
źródło
2
Użycie operatora „==” jest tutaj dość prostą i poprawną odpowiedzią.
HaseeB Mir
1
@HaSeeBMiR i = :)!
committedandroider
0

Spróbuj zamienić oba ciągi na wielkie lub małe litery. Następnie możesz użyć ==operatora porównania.

Nishant Nawarkhede
źródło
0

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())
Joe9008
źródło
-3

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
vijay9908
źródło