2013-10-20 45 views
2

我正在嘗試做一個瑣事程序,我得到的問題與答案。 我想要的是將顯示的答案字符替換爲提示。例如:python中的固定位置的字符串替換

answer = "I am just an example" 
hintwouldbe = "I a_ j___ a_ e______" 
hint2mightbe = "I am j___ an e_a___e" 

我不太確定如何製作它。試過循環(for c in answer)和string.replace方法。還嘗試了一些re.translate和dicts,但我得到了很大的代碼,很難理解。 Ther必須是一個更經濟的方式,所以...我就是這樣。

您認爲哪種方式最有效/更容易完成?

編輯這將是偉大的,如果我可以選擇什麼職位來取代。例如:如果這個詞有6個字符,用_

EDIT2更換1,3和6個字:正確的答案

有點變化後,我選擇托馬斯·奧羅斯科回答是有效的,是很容易的理解並重新創建:

from random import random 
    answer = "anything in here" 
    pista = [char if random() < 0.8 else "_" for char in answer] 
    pista2 = "".join(pista) 
    print(pista2) 

回答

2

字符串不是您想要做什麼的適當表示,列表會更好。

import random 

def make_hint(chars, frequency): 
    hint_chars = [char if random.random() < frequency else "_" for char in chars] 
    return "".join(hint_chars) 

answer = "I am just an example" 

print make_hint(answer, 0.3) 
print make_hint(answer, 0.5) 

當然,這只是一個例子。在這裏,我使用隨機顯示30%或50%的字符,但您可以使用不同的實現。

請記住,你可以先請回答.split()它的話分裂運行改造前:

print " ".join(make_hint(word, 0.3) for word in answer.split()) 
1

你應該把你心目中的邏輯(如在你的榜樣,在6個字母的單詞將第一,第三和第六)替換爲結構(例如字典)。然後,將這個句子分解成單詞並將它們應用於他們的邏輯。 這裏是與_交換字中的所需位置的功能:

def exchange(word,positions): 
    chars=list(word) 
     w="" 
    for i in range(1,len(chars)+1): 
     if i in positions: 
      w+='_' 
     else: 
      w+=chars[i-1] 
    return w 

把邏輯放到字典(7 - 捉字「示例」,和4趕上「只是」):

d={7:[1,3,6],4:[range(2,4+1)]} 

最後應用的邏輯:在規定的位置

words=answer.split() # split the sentence into word 
' '.join(map(lambda x: exchange(x,d.get(len(x),[])),words)) # apply the logic and join results 
>>> 'I am j___ an _x_mpl_' 
1

替換字符:

answer = "I am just an example" 
''.join('_' if i in (1,3,6) else answer[i] for i in range(0, len(answer))) 

爲了避免替換空格:

import string 
answer = "I am just an example" 
def pr((c,i,L)): 
if (i in L and c in string.letters + string.digits): 
    return '_' 
else: 
    return c 

''.join(map(pr,((answer[i],i,(1,3,6)) for i in range(len(answer))))) 

,並隨機(假設你不想代替空格):

answer = "I am just an example" 
import string 
import random 
''.join('_' if random.randint(0, 1) and i in string.letters + string.digits else i for i in answer) 
0

這種方法會自動替換所有,但第一個字母每個單詞用'_'表示,然後將允許基於索引的重新填充提示字母。它使用了三個list解析:

def hint(a, hidxs): 
    return ''.join(c[i in idxs] for i, c in enumerate(a)) 

a = zip(' '.join(w[0] + '_'*(len(w)-1) for w in answer.split()), answer) 
_idxs = [i for i, c in enumerate(hint(a, [])) if c == '_'] 

下面是如何使用它們:

>>> answer = "I am just an example" 
>>> a = zip(' '.join(w[0 ]+ '_'*(len(w)-1) for w in answer.split()), answer) 
>>> _idxs = [i for i, c in enumerate(hint(a, [])) if c == '_'] 
>>> _idxs #list of indexes for every '_' 
[3, 6, 7, 8, 11, 14, 15, 16, 17, 18, 19] 
>>> hidxs=[] 
>>> print 'Hint 1:', hint(a, hidxs) 
Hint 1: I a_ j___ a_ e______ 
>>> hidxs=[6] 
>>> print 'Hint 2:', hint(a, hidxs) 
Hint 2: I a_ ju__ a_ e______ 
>>> hidxs=[6, 14] 
>>> print 'Hint 3:', hint(a, hidxs) 
Hint 3: I a_ ju__ a_ ex_____ 
>>> hidxs=[6, 14, 17] 
>>> print 'Hint 4:', hint(a, hidxs) 
Hint 4: I a_ ju__ a_ ex__p__ 
>>> print 'Answer:', hint(a, _idxs) 
Answer: I am just an example 

,它隨機提示的程序應該是:

from random import shuffle 
def hint(a, hidxs): 
    return ''.join(c[i in idxs] for i, c in enumerate(a)) 

def all_hints(answer): 
    a = zip(' '.join(w[0 ]+ '_'*(len(w)-1) for w in answer.split()), answer) 
    _idxs = [i for i, c in enumerate(hint(a, [])) if c == '_'] 
    shuffle(_idxs) 
    hints = [] 
    print 'Press enter for next hint:' 
    for i in _idxs: 
     print 'Hint:', hint(a, hints), 
     hints.append(i) 
     raw_input() 
    print 'Answer:', hint(a, hints)