Присвоение значения в выражении сравнения while

1

Привет, мне было интересно, можно ли присвоить значение в разделе сравнения кода.

Ниже приведен пример кода

startIndex = find(target, key, startIndex)
while( startIndex != -1):
    matchesFound += 1
    startIndex = find(target, key, startIndex + 1)
return matchesFound

Что я хочу сделать, это переместить startIndex = find (target, key, startIndex) в выражение сравнения, чтобы оно выглядело примерно так.

while( (startIndex = find(target, key, startIndex)) != -1):
    matchesFound += 1
    startIndex + 1
return matchesFound

Если нет, то какой будет лучший рефактор?

Спасибо

изменить Я работаю через учебные курсы MIT Open 6.00, прежде чем попробовать знаменитый модуль 6.001.

  • 0
    Ответ до сих пор нет. Дубликат: stackoverflow.com/questions/1663995/…
  • 0
    Эти два даже одинаковы? В первом случае вы вызываете find сначала с startIndex , тогда как во втором вы вызываете его с startIndex+1 .
Показать ещё 2 комментария
Теги:

5 ответов

2
Лучший ответ

Если по какой-либо причине вы не можете использовать более подходящий метод из того, что вы ищете, это эквивалентно вашему рабочему коду из вопроса:

start = 0
count = 0
for match in iter(lambda: find(target, key, start), -1):
  count += 1
  start = match + 1
return count

Тем не менее, вы получите максимальный пробег от написания итератора для поиска этих совпадений, "преобразования" вашей текущей функции поиска:

def findall(target, key, start=0):
  for match in iter(lambda: find(target, key, start), -1):
    yield match
    start = match + 1

Затем подсчитайте:

count = sum(1 for m in findall(target, key))
  • 0
    +1 для первого, это и Pythonic, и (что более важно) фактически соответствует первому примеру OP в поведении.
  • 0
    Я не уверен насчет более pythonic, цикличность - хороший кандидат, но вопрос, кажется, просто пример кода, и эта форма iter () может работать лучше в том, что он действительно делает. :) (Я также сделал предположение, что startIndex начинается с 0, который не был указан, хотя, очевидно, это достаточно легко изменить.)
Показать ещё 2 комментария
1

Вы пишете C на Python.

Try:

startIndex = -1
while True:
    startIndex = find(target, key, startIndex + 1)
    if startIndex < 0:
        break
    matchesFound += 1
return matchesFound

Или, возможно, даже:

return target.count(key)
  • 1
    Это не соответствует коду ОП. startIndex нужно увеличивать на 1 при вызовах после первого.
  • 0
    +1 за признание в качестве соглашения C ... хотя я уверен, что это законно на других языках.
Показать ещё 6 комментариев
0

Нет, вы не можете сделать это на Python. Я думаю, что основная причина, по которой Python запрещает это, заключается в том, чтобы избежать частых ошибок, возникающих в результате запутывания задания и проверки равенства.

Python утверждает, что читаемый код является основным ориентиром, поэтому я думаю, что ваш оригинальный код в порядке. Нет необходимости в рефакторе...

0

я сделал бы это так:

startIndex=0
while 1:
    startIndex = find(target, key, startIndex+1)
    if startIndex == -1: break
    matchesFound += 1

вы можете добавить больше условий внутри цикла while.

Изменить: @OP, в будущем, чтобы подсчитать совпадение строки, просто используйте count

>>> mystring = "abc defabc fgh ijkabc blah"
>>> mystring.count("abc")
3
>>>
  • 0
    Также, очевидно, не совпадает с кодом OP, где startIndex передается в 1 на вызовы после первого.
0

Изменить.

Мы реорганизуем это так.

matches = [ k for k in range(len(target)-len(key)) if target[k:].startswith(key) ]
matchesFound = len(matches)

Нам не нужно условие C-стиля и контировка присваивания.

Редко вы просто хотите подсчет; фактические места доступны бесплатно.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню