Как сравнить две строки в Python?


86

У меня две струны вроде

string1="abc def ghi"

и

string2="def ghi abc"

Как добиться, чтобы эти две строки были одинаковыми, не нарушая слов?


13
Что значит «такие же»? Как вы определяете равенство строк?
Theox

41
Эти две строки не являются одинаковыми. Строки порядка в important is.
jonrsharpe

8
Если ваша проблема решена, отметьте любой ответ как принятый
oxfn

Ответы:


69

Кажется, вопрос не в равенстве строк, а в равенстве множеств . Вы можете сравнить их таким образом, только разбив строки и преобразовав их в наборы:

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

Результат будет

True

1
Игнорирование случая с использованием лямбда 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 В этом нет необходимости map, так как вы можете нормализовать регистр строк перед разделением
oxfn

57

Если вы хотите узнать, равны ли обе строки, вы можете просто сделать

print string1 == string2

Но если вы хотите узнать, имеют ли они одинаковый набор символов и встречаются ли они одинаковое количество раз, вы можете использовать collections.Counter, например, этот

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

Что-то вроде этого:

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

update: если вы хотите увидеть, может ли каждая подстрока существовать в другой:

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

Для этого вы можете использовать diffflib по умолчанию в python

from difflib import SequenceMatcher

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

затем вызовите аналогичный () как

similar(string1, string2)

он вернет сравнение как, ratio> = threshold, чтобы получить результат соответствия


8

Равенство в прямом сравнении:

string1 = "sample"
string2 = "sample"

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

Равенство в наборах символов:

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

Я собираюсь предложить несколько решений, и вы можете выбрать то, которое соответствует вашим потребностям:

1) Если вас интересуют только символы, то есть одинаковые символы и одинаковые частоты каждого из них в обеих строках, используйте:

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

2) Если вас также беспокоит количество пробелов (пробелов) в обеих строках, просто используйте следующий фрагмент:

sorted(string1) == sorted(string2)

3) Если вы рассматриваете слова, но не их порядок и проверяете, имеют ли обе строки одинаковую частоту слов, независимо от их порядка / встречаемости, тогда можно использовать:

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

4) Расширяя вышесказанное, если вас не интересует подсчет частоты, а просто нужно убедиться, что обе строки содержат один и тот же набор слов, тогда вы можете использовать следующее:

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

Для третьего collection.Countersorted
варианта

4

Если вам просто нужно проверить, совпадают ли две строки,

text1 = 'apple'

text2 = 'apple'

text1 == text2

Результат будет

True

Если вам нужен соответствующий процент,

import difflib

text1 = 'Since 1958.'

text2 = 'Since 1958'

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

Соответствующий процентный вывод будет,

'95'

3

Я думаю, что difflib - хорошая библиотека для этой работы

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

откройте оба файла, затем сравните их, разделив его текстовое содержимое;

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

Если вам нужен действительно простой ответ:

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
Использование оператора '==' здесь довольно простой и правильный ответ.
HaseeB Mir

1
@HaSeeBMiR и! = :)
committedandroider

0

Попробуйте преобразовать обе строки в верхний или нижний регистр. Затем вы можете использовать ==оператор сравнения.


0

Это довольно простой пример, но после логических сравнений (==) или string1.lower() == string2.lower() , может быть, может быть полезно попробовать некоторые из основных показателей расстояний между двумя строками.

Повсюду можно найти примеры, связанные с этими или некоторыми другими показателями, попробуйте также пакет fuzzywuzzy ( https://github.com/seatgeek/fuzzywuzzy ).

import Levenshtein
import difflib

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

-3

Вы можете использовать простые циклы, чтобы проверить равенство двух строк. Но в идеале вы можете использовать что-то вроде 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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.