2013-08-03 47 views
0

我正在研究一段代码,它需要在一个单词中查找某些字符,然后替换生成的字符串中的那些字符。当单词只有一个字符时,代码工作正常;但是,当我有两个或更多相同类型的字符时,代码只会识别第一个字符,而忽略以下字符。你有什么建议如何解决这个问题?在字符串中查找两个或更多相同类型的字符?

高清write_words(字,人):

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)

+0

只需添加一个while循环来检查y。你将不得不划掉词中的创建字符。 – Jiminion

+1

我不明白你想要做什么。你能举个例子吗? –

+1

'word.replace('x','y')'有什么问题?你的代码对我来说不清楚,它非常复杂,但很少。 –

回答

1

这里的问题是,第一次出现的find()回报指数的元素。

您可以使用下面的代码来代替事件。

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

P.S - 你目前的代码一些指点。

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 = ['_']*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' 

哪给了我们我们想要的东西。

+0

@ user2644430:检查编辑。 :) –

+0

非常感谢,我不知道该怎么办! – user2644430

+0

@ user2644430:如果我帮助你,请[接受答案](http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work)。访问链接并查看接受答案是如何工作的。 :) –

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 
0

这应该做些什么的任择议定书要求,以最小的变化的原代码。如果“_”是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 
+0

你能否详细说明你的答案? –

相关问题