Skip to main content
 首页 » 编程设计

python之使用python的字符串中最接近的字符

2025年05月04日21jackei

我对 Python 比较陌生;我编写了以下代码来查找字符串中与 queries 中的索引最接近的字符,我想找到一种优化代码的方法:

示例:

输入字符串: s = 'adarshravi'

和queries = [2, 4](这些是要查找重复字符的索引,输出应该有最接近重复的索引,如果没有重复字符,那么它的输出将为 -1)

上述查询的输出将是: [0, -1]

输出说明:

对于索引 2,字符串中的字符是 a 字符串中还有另外两个 a,一个在 0 索引处,另一个一个在索引 7,所以两者之间最接近的是在 0th 位置的那个,而在 4th 索引的字符是s 在字符串中不重复 所以 -1

def closest(s, queries): 
 
    s = s.lower() 
    listIdx = [] 
 
    for i in queries: 
        foundidx = [] 
        srchChr = s[i] 
 
        for j in range(0, len(s)): 
            if s[j] == srchChr: 
                foundidx.append(j) 
 
        if len(foundidx) < 2: 
            listIdx.append(-1) 
        else: 
            lastIdx = -1 
            dist = 0 
            foundidx.remove(i) 
            for fnditem in foundidx: 
                if dist == 0: 
                    lastIdx = fnditem 
                    dist = abs(fnditem - i) 
                else: 
                    if abs(fnditem - i) < dist: 
                        lastIdx = fnditem 
                        dist = abs(fnditem - i) 
            listIdx.append(lastIdx) 
    return listIdx 

请您参考如下方法:

我们可以构造一个索引列表,如:

from itertools import zip_longest 
 
def ranges(k, n): 
    for t in zip_longest(range(k-1, -1, -1), range(k+1, n)): 
        yield from filter(lambda x: x is not None, t) 

因此生成的索引如下:

>>> list(ranges(3, 10)) 
[2, 4, 1, 5, 0, 6, 7, 8, 9] 

我们可以使用上面的方法来检查最接近的字符:

def close(text, idx): 
    ci = text[idx] 
    return next(filter(lambda i: ci == text[i], ranges(idx, len(text))), -1) 

这会产生:

>>> close('adarshravi', 0) 
2 
>>> close('adarshravi', 1) 
-1 
>>> close('adarshravi', 2) 
0 
>>> close('adarshravi', 3) 
6 
>>> close('adarshravi', 4) 
-1 

closest 只是 close 函数在列表上的“映射”:

from functools import partial 
 
def closest(text, indices): 
    return map(partial(close, text), indices) 

例如:

>>> list(closest('adarshravi', range(5))) 
[2, -1, 0, 6, -1]