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

2024-09-28 03:22:16 发布

您现在位置:Python中文网/ 问答频道 /正文

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

示例:

输入字符串: s = 'adarshravi'

queries = [2, 4](这些是要找到其重复项的字符的索引,并且输出应具有最接近的重复项的索引,如果没有重复字符,则其输出将为-1)

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

输出说明:

对于索引2,字符串中的字符是a,字符串中还有另外两个a's,一个在0索引处,另一个在索引7处,因此这两个字符之间最接近的是0'th位置的字符,4th索引处的字符是{},在字符串中不会重复,所以-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

Tags: 字符串代码inforifdistabs字符
3条回答

这是通过创建带有索引的元组来实现的,如果元组中的字符相同,则比较两个索引之间差异的abs值。当创建s_lst时,queries中的元组被省略,以避免与自身匹配

s = 'adarshravi'
queries = [2, 4]
queries = [(i, s[i]) for i in queries]

s_lst = [(i, v) for i, v in enumerate(s) if any(v in x for x in queries)]
s_lst = [i for i in s_lst if not any(i[0] in x for x in queries)]

res = []
for i in queries:
    if not any(i[1] in x for x in s_lst):
        res.append(-1)
    else:
        close = None
        for j in s_lst:
            if j[1] == i[1] and close == None:
                close = j
            elif abs(j[0] - i[0]) < abs(close[0] - i[0]):
                close = j
        res.append(close[0])

print(res)
# [0, -1]
def closest_duplicates(s, queries):
    result = []
    for index in queries:
        result.append(closest_duplicate(s, s[index], index))
    return result

这家伙在搜索个别物品

下面的代码从两个索引开始:一个从开始到左边,另一个从右边开始。我们不需要运行这个循环超过字符串-1的长度。当字符到达末尾或第一次找到字符时,我们返回索引。如果没有找到,我们返回-1

^{pr2}$

测试如下

if __name__ == '__main__':
    s = 'adarshravi'
    indexes = [2, 4]
    result = closest_duplicates(s, indexes)
    print(result)
    batman = 'ilovebatmanandbatman'
    indx = [1,2,5,6]
    result = closest_duplicates(batman, indx)
    print(result)
    batman = 'iloveabatmanbatmanandbatman'
    indx = [7]
    result = closest_duplicates(batman, indx)
    print(result)

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

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)

这就产生了如下指数:

^{pr2}$

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

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]

相关问题 更多 >

    热门问题