检测2个字符串是否相同但顺序不同

时间:2017-10-12 07:30:06

标签: python string-matching

我的目标是检测2个字符串是否相同但顺序不同。

Example
"hello world my name is foobar" is the same as "my name is foobar world hello"

我已经尝试过将两个字符串拆分成列表并在循环中进行比较。

text = "hello world my name is foobar"
textSplit = text.split()

pattern = "foobar is my name world hello"
pattern = pattern.split()

count = 0
for substring in pattern:
    if substring in textSplit:
        count += 1

if (count == len(pattern)):
    print ("same string detected")

它返回我的意图,但这是否真的是正确有效的方式?也许还有另一种方法。关于该主题的期刊的任何建议都会非常好。

编辑1:重复的单词很重要

text = "fish the fish the fish fish fish"
pattern = "the fish" 

必须返回false

4 个答案:

答案 0 :(得分:3)

我认为通过你的实现,文本中的额外单词会被忽略(也许这是有意的吗?)。

即如text = "a b"pattern = "a"那么你的"same string detected"

我这样做的方式: 比较顺序无关紧要让我想到sets。 因此,使用集合的解决方案将是:

same = set(text.split()) == set(pattern.split())

编辑: 考虑到重复的单词编辑问题:

from collections import Counter
split_text = text.split()
split_pattern = pattern.split()
same = (Counter(split_text) == Counter(split_pattern))

答案 1 :(得分:1)

如果你想检查2个句子是否有相同的单词(出现次数相同),你可以用句子分割句子并对它们进行排序:

>>> sorted("hello world my name is foobar".split())
['foobar', 'hello', 'is', 'my', 'name', 'world']
>>> sorted("my name is foobar world hello".split())
['foobar', 'hello', 'is', 'my', 'name', 'world']

您可以在函数中定义检查:

def have_same_words(sentence1, sentence2):
    return sorted(sentence1.split()) == sorted(sentence2.split())

print(have_same_words("hello world my name is foobar", "my name is foobar world hello"))
# True

print(have_same_words("hello world my name is foobar", "my name is foobar world hello"))
# True

print(have_same_words("hello", "hello hello"))
# False

print(have_same_words("hello", "holle"))
# False

如果情况不重要,您可以比较小写句子:

def have_same_words(sentence1, sentence2):
    return sorted(sentence1.lower().split()) == sorted(sentence2.lower().split())

print(have_same_words("Hello world", "World hello"))
# True

注意:您也可以使用collections.Counter代替sorted。复杂性为O(n)而不是O(n.log(n)),这无论如何都不是很大的区别。 import collections可能比排序字符串花费更长的时间:

from collections import Counter

def have_same_words(sentence1, sentence2):
    return Counter(sentence1.lower().split()) == Counter(sentence2.lower().split())

print(have_same_words("Hello world", "World hello"))
# True

print(have_same_words("hello world my name is foobar", "my name is foobar world hello"))
# True

print(have_same_words("hello", "hello hello"))
# False

print(have_same_words("hello", "holle"))
# False

答案 2 :(得分:0)

你可以从每个字符串中创建一个列表并计算它们之间的字符串交集;如果它的长度与第一个相同,那么它们就是一样的。

text = "hello world my name is foobar"
pattern = "foobar is my name world hello"
text = text.split(" ")
pattern = pattern.split(" ")
result = True
if len(text) != len(pattern):
    result = false
else:
    l = list(set(text) & set(pattern))
    if len(l)!=len(text):
        result = False
if result == True:
    print ("same string detected")
else:
    print ("Not the same string") 

答案 3 :(得分:0)

你也可以从你想要比较的字符串中创建一个新字符串str12。然后比较str12的长度和2 *(str12没有重复)

str1 = "hello world my name is foobar"
str2 = "my name is foobar world hello"


str12 = (str1 + " " +str2).split(" ")

str12_remove_duplicate = list(set(str12))

if len(str12) == 2 * len(str12_remove_duplicate):
    print("String '%s' and '%s' are SAME but different order" % (str1, str2))
else: 
    print("String '%s' and '%s' are NOT SAME" % (str1, str2))