找到两个字符串之间的交集的最佳方法是什么?

max*_*igo 5 python string performance set

我需要找到两个字符串之间的交集。断言:

assert intersect("test", "tes") == list("tes"), "Assertion 1"
assert intersect("test", "ta") == list("t"), "Assertion 2"
assert intersect("foo", "fo") == list("fo"), "Assertion 3"
assert intersect("foobar", "foo") == list("foo"), "Assertion 4"
Run Code Online (Sandbox Code Playgroud)

我尝试了该intersect函数的不同实现。intersect将收到 2 个str参数,w并且w2


列表理解。迭代并查找第二个字符串中出现的情况。

return [l for l in w if l in w2]
Run Code Online (Sandbox Code Playgroud)

断言 1 和 2失败,因为多个t inw与一个t in匹配w2


设置交叉点。

return list(set(w).intersection(w2)
return list(set(w) & set(w2))
Run Code Online (Sandbox Code Playgroud)

断言 3 和 4失败,因为集合是 acollection of unique elements并且重复的字母将被丢弃。


迭代并计数。

out = ""
for c in s1:
    if c in s2 and not c in out:
        out += c
return out
Run Code Online (Sandbox Code Playgroud)

失败是因为它也消除了重复项。


difflibPython 文档

letters_diff = difflib.ndiff(word, non_wildcards_letters)
letters_intersection = []

for l in letters_diff:
    letter_code, letter = l[:2], l[2:]
    if letter_code == "  ":
        letters_intersection.append(letter)

return letters_intersection
Run Code Online (Sandbox Code Playgroud)

通行证


difflib可行,但有人能想到更好的、优化的方法吗?

编辑: 该函数将返回字符列表。顺序并不重要。

Adi*_*219 3

尝试这个:

def intersect(string1, string2): 
    common = []
    for char in set(string1):
        common.extend(char * min(string1.count(char), string2.count(char)))

    return common
Run Code Online (Sandbox Code Playgroud)

注意:它不保留顺序(如果我没记错set()的话,字母将按字母顺序返回)。但是,正如您在评论中所说,顺序并不重要