Pythonで2つの文字列を比較するにはどうすればよいですか?


83

私はのような2つの文字列を持っています

string1="abc def ghi"

そして

string2="def ghi abc"

この2つの文字列を単語を壊さずに同じにする方法は?


13
「同じ」とはどういう意味ですか?文字列の同等性のあなたの定義は何ですか?
Theox 2014

41
これらの2つの文字列同じではありません。重要な順序文字列はです。
jonrsharpe 2014

8
問題が解決した場合は、回答を承認
済み

回答:


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

@Abhijeetmap分割する前に文字列の大文字と小文字を正規化できるため、必要はありません
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

そのために、Pythonでデフォルトのdifflibを使用できます

from difflib import SequenceMatcher

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

次に、similar()を次のように呼び出します。

similar(string1, string2)

一致結果を取得するには、compare as、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())

3番目のユースケースでcollection.Counter は、使用するよりも明白に思えますsorted
GrijeshChauhan19年

4

2つの文字列が完全に同じかどうかを確認する必要がある場合は、

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
'=='演算子の使用はかなり簡単で、ここでは正解です。
haseeBMir19年

1
@HaSeeBMiRと= :)!
committedandroider


0

これはかなり基本的な例ですが、論理比較(==)またはの後で、string1.lower() == string2.lower()2つの文字列間の距離の基本的なメトリックのいくつかを試すのに役立つ場合があります。

これらまたは他のいくつかのメトリックに関連する例はどこにでもあります。fuzzywuzzyパッケージ(https://github.com/seatgeek/fuzzywuzzy)も試してください

import Levenshtein
import difflib

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

-3

単純なループを使用して、2つの文字列が等しいことを確認できます。。しかし、理想的には、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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.