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?


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

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

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

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

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


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

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

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'

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

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

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

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.


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

-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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.