2015-04-17 3 views
1

Я работаю над написанием сценария для игры в палач в Python. Предположим, что компьютер выбирает случайное слово (строка):Замена элементов в строке вхождения

bb = "artist" 

Если игрок вводит предположение:

a = "t" 

Это легко проверить, является ли или нет, что в слове "artist" и таким образом ли это это правильная догадка или нет. Кроме того, легко изменить слово "artist" в зазоры соответствующей длины:

cc = "_ " * len (bb) 

Где у меня возникли проблемы, хотя, заполняет пробелы для правильного предположения. То есть, преобразуя выше:

_ _ t_ _ t 

Я пытался играть с

cc.replace() 

, но безрезультатно. Есть идеи?

+0

Так где же ваш ближайший попытка, и в чем именно проблема с этим? – jonrsharpe

+0

Пожалуйста, придумайте лучшие имена переменных. Написав ответ, я три раза использовал неправильных, прежде чем правильно это понять, потому что невозможно вспомнить, означает ли «bb» целевое слово и 'cc' в настоящее время угадаемое частичное слово или наоборот. – abarnert

+0

Я хотел бы упомянуть о другом подходе: вы могли бы заменить все еще не угаданные буквы в решении '_' :) – yoshi

ответ

0

cc.replace не собирается, чтобы помочь вам здесь, потому что replace не имеет возможности различать между одним и другим __, что это именно то, что вы пытаетесь сделать: вы хотите, чтобы заменить те, которые в том же положении как '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)) 
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 
0

Вы можете сделать это с помощью re

import re 
bb = 'artist' 
>>>re.sub("[^t]","_",bb) 
'__t__t' 

>>>re.sub("[^t]", "_ ", bb) 
'_ _ t_ _ t' 
Смежные вопросы