我如何比较python中的两个字符串?

use*_*366 77 python string string-comparison python-2.7

我有两个字符串

string1="abc def ghi"
Run Code Online (Sandbox Code Playgroud)

string2="def ghi abc"
Run Code Online (Sandbox Code Playgroud)

如何在不破坏单词的情况下获得这两个字符串相同?

oxf*_*xfn 61

似乎问题不是字符串相等,而是集合相等.你可以这样比较它们只能通过分割字符串,并将其转换为集:

s1 = 'abc def ghi'
s2 = 'def ghi abc'
set1 = set(s1.split(' '))
set2 = set(s2.split(' '))
print set1 == set2
Run Code Online (Sandbox Code Playgroud)

结果将是

True
Run Code Online (Sandbox Code Playgroud)


the*_*eye 51

如果你想知道两个字符串是否相等,你可以简单地做

print string1 == string2
Run Code Online (Sandbox Code Playgroud)

但是如果你想知道它们是否都有相同的字符集并且它们出现的次数相同,你可以collections.Counter像这样使用

>>> string1, string2 = "abc def ghi", "def ghi abc"
>>> from collections import Counter
>>> Counter(string1) == Counter(string2)
True
Run Code Online (Sandbox Code Playgroud)


Tan*_*lam 12

>>> 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']
Run Code Online (Sandbox Code Playgroud)


phi*_*hem 7

像这样的东西:

if string1 == string2:
    print 'they are the same'
Run Code Online (Sandbox Code Playgroud)

更新:如果要查看每个子字符串是否可能存在于另一个子字符串中:

elem1 = [x for x in string1.split()]
elem2 = [x for x in string2.split()]

for item in elem1:
    if item in elem2:
        print item
Run Code Online (Sandbox Code Playgroud)


A.G*_*A.G 7

直接比较中的平等:

string1 = "sample"
string2 = "sample"

if string1 == string2 :
    print("Strings are equal with text : ", string1," & " ,string2)
else :
    print ("Strings are not equal")
Run Code Online (Sandbox Code Playgroud)

字符集相等:

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")
Run Code Online (Sandbox Code Playgroud)


arj*_*jun 7

如果您只需要检查两个字符串是否完全相同,

text1 = 'apple'

text2 = 'apple'

text1 == text2
Run Code Online (Sandbox Code Playgroud)

结果将是

True
Run Code Online (Sandbox Code Playgroud)

如果您需要匹配的百分比,

import difflib

text1 = 'Since 1958.'

text2 = 'Since 1958'

output = str(int(difflib.SequenceMatcher(None, text1, text2).ratio()*100))
Run Code Online (Sandbox Code Playgroud)

匹配的百分比输出将是,

'95'
Run Code Online (Sandbox Code Playgroud)


小智 6

为此,您可以在python中使用默认的difflib

from difflib import SequenceMatcher

def similar(a, b):
    return SequenceMatcher(None, a, b).ratio()
Run Code Online (Sandbox Code Playgroud)

然后调用like()作为

similar(string1, string2)
Run Code Online (Sandbox Code Playgroud)

它将返回compare为,ratio> = threshold以获取匹配结果


Arc*_*oor 5

我将提供几种解决方案,您可以选择一种满足您需求的解决方案:

1)如果只关注字符,即,两个字符串中相同的字符且每个字符的频率相同,请使用:

''.join(sorted(string1)).strip() == ''.join(sorted(string2)).strip()
Run Code Online (Sandbox Code Playgroud)

2)如果您还担心两个字符串中的空格数(空格字符),则只需使用以下代码段:

sorted(string1) == sorted(string2)
Run Code Online (Sandbox Code Playgroud)

3)如果您在考虑单词而不是单词的顺序,并检查两个字符串的单词频率是否相等,则无论它们的顺序/出现情况如何,都可以使用:

sorted(string1.split()) == sorted(string2.split())
Run Code Online (Sandbox Code Playgroud)

4)扩展以上内容,如果您不关心频率计数,而只需要确保两个字符串包含相同的单词,则可以使用以下内容:

set(string1.split()) == set(string2.split())
Run Code Online (Sandbox Code Playgroud)