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)
失败是因为它也消除了重复项。
difflib(Python 文档)
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可行,但有人能想到更好的、优化的方法吗?
编辑: 该函数将返回字符列表。顺序并不重要。
尝试这个:
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()的话,字母将按字母顺序返回)。但是,正如您在评论中所说,顺序并不重要
| 归档时间: |
|
| 查看次数: |
5279 次 |
| 最近记录: |