0

我正在编写一段代码,该代码需要在单词中查找某些字符,然后在生成的字符串中替换这些字符。当单词每个字符只有一个时,代码可以正常工作;但是,当我有两个或多个相同类型的字符时,代码仅识别第一个字符并忽略以下字符。您对如何解决此问题有任何建议吗?

def write_words (word, al):

newal = (list(al))
n = len(word)
i = 0
x = 0
a = []
b = ["_"]
for i in range(0, n):
    a = a + b
while (x <(len(newal))):
    z = newal[x]
    y = word.find(z)
    x = x + 1
    print (y)
    if y >= 0:
        a[y] = z
return(a)

(我正在使用的 Python 版本是 3.2.1)

4

3 回答 3

1

这里的问题是find()返回元素第一次出现的索引。

您可以只使用以下代码来替换出现的情况。

>>> word = 'abcdabcd'
>>> ignore = 'ab'
>>> "".join([elem if elem not in ignore else '_' for elem in word])
'__cd__cd'

PS - 关于您当前代码的一些指针。

def write_words (word, al):
    newal = (list(al))
    n = len(word)
    i = 0
    x = 0
    a = []
    b = ["_"]
    for i in range(0, n):
        a = a + b
    while (x <(len(newal))):
        z = newal[x]
        y = word.find(z)
        x = x + 1
        print (y)
        if y >= 0:
            a[y] = z
    return(a)
  1. 与其做一个for循环并_在 a 中的每个元素上附加,你可以只做a = ['_']*len(word).
  2. 您不需要在此处使用 while 循环或将您的单词转换为list. 字符串是可迭代的,所以你可以只做for elem in newal. 这样你就不必保留一个单独的x变量来迭代字符串。

所以,现在你的代码减少到

>>> def write_words_two(word, al):
        a = ['_']*len(word)
        for elem in al:
            y = word.find(elem)
            print(y)
            a[y] = z
        return a

但是,它仍然存在与以前相同的问题。现在的问题似乎是word.find(elem)只返回第一个字符的出现而不是所有字符出现的索引。所以,与其先建立一个列表然后替换字符,我们应该建立一个列表,并测试我们忽略的字符的每个字符,如果需要忽略该字符,我们只需将其替换为替换在列表中。然后,我们想出了下面的代码

>>> def write_words_three(word, al, ignore):
        a = []
        for elem in word:
            if elem in al:
                a.append(ignore)
            else:
                a.append(elem)
        return a

>>> write_words_three('abcdabcd', 'ab', '_')
['_', '_', 'c', 'd', '_', '_', 'c', 'd']

但是,它似乎仍然返回列表而不是字符串,这就是我们想要的,而且它似乎也有点大。那么,为什么不用列表理解来缩短它呢?

>>> def write_words_four(word, al, ignore):
        return [elem if elem not in al else ignore for elem in word]

>>> write_words_threefour('abcdabcd', 'ab', '_')
['_', '_', 'c', 'd', '_', '_', 'c', 'd']

尽管如此,我们仍然需要一个字符串,我们的代码只返回一个列表。我们可以使用该join(...)方法并连接字符串的每个元素。

>>> def write_words_five(word, al, ignore):
        return "".join([elem if elem not in al else ignore for elem in word])

>>> write_words_five('abcdabcd', 'ab', '_')
'__cd__cd'

这给了我们想要的东西。

于 2013-08-03T19:23:34.800 回答
0

用这个替换你的find函数:

def myfind(main, x):
    return [i for i,j in enumerate(x) if j==x]

这样在您的代码中:

ys = myfind( word, z )
for y in ys:
    a[y] = z
于 2013-08-03T19:25:11.370 回答
0

这应该按照 OP 的要求进行,对原始代码的更改最少。如果“_”是 al 中允许的字符,则不起作用。

def write_words (word, al):
    newal = (list(al))
    n = len(word)
    i = 0
    x = 0
    a = []
    b = ["_"]
    for i in range(0, n):
        a = a + b
    while (x <(len(newal))):
        z = newal[x]
        y = word.find(z)
        while (y >= 0):
            print (y)
            a[y] = z
            word[y] = "_"
            y = word.find(z)
        x = x + 1
    return a
于 2013-08-03T19:26:05.747 回答