цикл for не повторяется полностью в python - PullRequest
0 голосов
/ 05 июля 2018

Я хочу пройти через цикл for, чтобы найти все вхождения "%", за которыми следует целое число, и заменить их другим словом.

 for x in format:
     if x is "%":
         finder = format.find("%")
         val = format[finder + 1]
         index = int(format[finder + 1])
         print("Index value is %d" % index)
         replace = args[index]
         print(replace)
         str = format.replace(val, replace)
 return str

Если в формате более одного "%" (то есть строка), то заменяется только целое число.

Например: формат: "%1 greets %0" and args = "Bob", "Alex"

Выходные данные должны быть: "Alex greets Bob"

Но я получаю "Alex greets %0"

Ответы [ 3 ]

0 голосов
/ 05 июля 2018

Ваша проблема в этой строке if x is "%":, оператор is проверяет, являются ли оба объекта одним и тем же. Вам нужно использовать if x=='%' (оператор == проверяет, являются ли оба значения одинаковыми или нет, для возврата True необязательно быть обоими одинаковыми объектами.

0 голосов
/ 05 июля 2018

Определенно есть лучшие способы сделать это, но если вы хотите сделать это с помощью цикла, это сработает.

item = '%1 greets %0'
args = ['bob','alex']
loc = 0
for x in item:  
    if x == "%":
        loc = item.find("%",loc)
        val ='%'+ item[loc +1]
        index = int(item[loc +1])
        replace = args[index]
        item = item.replace(val,replace)
        loc +=1

print(item)

Ваше решение не работает, потому что вы продолжаете искать ту же строку (формат), но сохраняете результат в другой строке (str). Поэтому метод find всегда найдет первый% в строке формата.

Еще один комментарий, который я хотел бы добавить, - избегать именования ваших переменных в качестве ключевых слов python, таких как format и str.

0 голосов
/ 05 июля 2018

Вам нужно написать if x == "%" вместо if x is "%". Оператор is проверяет, являются ли они одним и тем же объектом, а не имеют ли они одинаковое содержимое.

Другая проблема заключается в том, что .find('%') всегда возвращает позицию первого % в строке, независимо от того, где вы находитесь в своей итерации. Вы можете изменить свой код на что-то вроде

for finder, x in enumerate(format):
     if x is "%":
         # you already know your position
         val = format[finder+1]
         ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...