Як порівняти два рядки в python?


83

У мене є два рядки, як

string1="abc def ghi"

і

string2="def ghi abc"

Як отримати, що ці два рядки однакові, не порушуючи слів?


13
Що ви маєте на увазі "однакові"? Яке ваше визначення рівності рядків?
Theox

41
Ці два рядки не однакові. Порядок рядків у важливому є.
jonrsharpe

8
Якщо вашу проблему вирішено, будь-ласка, будь-яку відповідь позначте як прийняту
oxfn

Відповіді:


68

Здається, питання полягає не в рівності рядків, а в рівності множин . Ви можете порівняти їх таким чином, лише розділивши рядки та перетворивши їх у набори:

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) демо
Abhijeet

@Abhijeet У цьому немає необхідності map, оскільки ви можете нормалізувати регістр рядків перед розбиттям
oxfn

56

Якщо ви хочете знати, чи рівні обидва рядки, ви можете просто зробити

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'

оновлення: якщо ви хочете дізнатись, чи може кожна підрядок існувати в іншій:

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

Для цього ви можете використовувати за замовчуванням difflib у python

from difflib import SequenceMatcher

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

потім викличте аналогічний () як

similar(string1, string2)

він поверне порівняння як, співвідношення> = поріг, щоб отримати результат збігу


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.Counter здається більш очевидним, ніж використанняsorted
Грієш Чаухан,

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.