按出现次数替换字符串中的项目

时间:2015-04-17 15:41:05

标签: python

我正在为Python编写一个刽子手游戏的脚本。假设计算机选择随机字(字符串):

bb = "artist"

如果玩家输入猜测:

a = "t"

很容易验证单词"artist"中是否存在,因此是否是正确的猜测。此外,很容易将单词"artist"更改为适当长度的空白:

cc = "_ " * len (bb)
但是,我遇到麻烦的时候,填补了正确猜测的空白。也就是说,将上述内容转换为:

_ _ t_ _ t

我试过玩

cc.replace()

但无济于事。有什么想法吗?

3 个答案:

答案 0 :(得分:0)

cc.replace不会对您有所帮助,因为replace无法区分一个_和另一个_,这正是您尝试这样做:您希望将{em>位于同一位置的替换为't'中的bb字母。

“在同一位置”几乎意味着你将要么通过索引工作,要么使用zip

如果cc中的空格不在bb中,则这很容易。其中任何一个:

cc = ''.join(a if bb[i] == a else cc[i] for i in range(len(cc)))
cc = ''.join(a if b == a else c for b, c in zip(bb, cc))

我认为第二个更简单,但是......

不幸的是,cc中的这些空格不在bb中。因此,cc的元素与bb的元素不对齐;偶数的元素在索引的一半处与bb元素对齐,奇数元素总是空格。所以,你几乎不得不使用索引来做到这一点,这很难看:

cc = ''.join(a if (i % 2 == 0 and bb[i//2] == a) else cc[i]
             for i in range(len(cc)))

我认为cc中存储空格会更好。就此而言,没有理由cc必须是字符串而不是列表。就这样做:

cc = ['_' for _ in bb]

然后,更新它:

cc = [a if b == a else c for b, c in zip(bb, cc)]

然后,将其转换为您要打印的字符串:

print(' '.join(cc))

答案 1 :(得分:0)

正如@abarnert所述,您不应该使用cc.replace()

一个简单的解决方案是开始使用cc的列表,然后使用enumerate()函数:

bb = "artist"
cc = []
[cc.append("_") for x in bb]         #make cc a list of "_" with the same length as bb

while ''.join(cc)!=bb:               #while cc does not equal bb
    a=raw_input("Enter letter: ")    #here, use input() if you use Python 3

    for index,val in enumerate(bb):  #this checks the index and value of bb
        if val==a:                   #if the letter matches the input
            cc[index]=val            #replace the list element with the input

    print ' '.join(cc)               #now you can print the list with spaces and repeat

答案 2 :(得分:0)

您可以使用re

执行此操作
import re
bb = 'artist'
>>>re.sub("[^t]","_",bb)
'__t__t'

>>>re.sub("[^t]", "_ ", bb)
'_ _ t_ _ t'