我有一个用户输入两个字符串然后我想检查是否有任何相似的字符,如果有,请获取第一个相似性发生的位置,而不使用find或index函数。
以下是我到目前为止的情况,但我没有完全发挥作用。到目前为止,我能够找到相似之处,但我不知道如何在不使用索引函数的情况下找到相似性的位置。
string_a = "python"
string_b = "honbe"
same = []
a_len = len(string_a)
b_len = len(string_b)
for a in string_a:
for b in string_b:
if a == b:
same.append(b)
print (same)
现在输出是:
['h', 'o', 'n']
基本上我要问的是,如何在不使用Python索引函数的情况下找到这些字符的位置?
答案 0 :(得分:6)
这是difflib.SequenceMatcher
的完美用例:
import difflib
string_a = 'python'
string_b = 'honbe'
matcher = difflib.SequenceMatcher(a=string_a, b=string_b)
match = matcher.find_longest_match(0, len(matcher.a), 0, len(matcher.b))
match
对象将具有a
,b
和size
属性,其中a
是字符串{{1}的起始索引},matcher.a
是b
的起始索引,matcher.b
是匹配的长度。
例如:
size
答案 1 :(得分:3)
您可以使用列表推导和itertools的组合来解决此问题。
import itertools
string_a = 'hello_world'
string_b = 'hi_low_old'
same = [ i for i,x in enumerate(itertools.izip(string_a,string_b)) if all(y==x[0] for y in x)]
In [38]: same
Out[38]: [0, 3, 4, 7]
这里我们逐个元素地比较两个字符串,并返回已发现相似的所有索引。可以轻松更改输出以包括匹配的字符等。此方法可以轻松缩放以比较多个单词。
答案 2 :(得分:2)
你应该遍历指数:
for i in range(len(string_a)):
for j in range(len(string_b)):
if string_a[i] == string_b[j]:
same.append((i, j, string_b[j]))
这将创建一个类似于:
的元组列表[ (3, 0, "h"), ... ]
答案 3 :(得分:1)
def find_similarity(string_a, string_b):
for ia, ca in enumerate(string_a):
for ib, cb in enumerate(string_b):
if ca == cb:
return ia, ib, ca
如果您希望所有匹配而不是第一个匹配,则可以使用return
语句替换yield
语句,并迭代结果,或者只是:
matches = list(find_similarity(string_a, string_b))
在后一种情况下,你得到:
list(find_similarity(string_a, string_b))
=> [(3, 0, 'h'), (4, 1, 'o'), (5, 2, 'n')]
答案 4 :(得分:0)
如果只需要查找在Python 3.x中字母重叠的索引,则可以这样做:
Cancel
输出
str_a = "Python is a great language"
str_b = "languages express meaning"
result = [i for i, (a, b) in enumerate(zip(str_a, str_b)) if a == b]