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

86

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

string1="abc def ghi"

и

string2="def ghi abc"

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

пользователь3064366
источник
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")
AG
источник
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())
Joe9008
источник
-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
vijay9908
источник