Моя переменная цикла сбрасывается в true, хотя цикл должен остановиться - PullRequest
0 голосов
/ 23 июня 2019

У меня есть цикл while, который отлично работал в предыдущих версиях Python.Теперь переменная цикла, кажется, получает сброс.Имейте в виду, я делаю это просто как хобби, поэтому, если есть другой / лучший способ достичь моего результата - не стесняйтесь.

Так что этот код имеет список чисел и сравнивает их с другим списком.Если num в numbers отсутствует в другом списке, он удаляется.и процесс перезапускается.Проблема в том, что после совпадения списков переменная цикла по-прежнему сбрасывается на True и код it застревает в цикле:

loop = True
def remove_games():
    for num in numbers:
        loop = False
        if int(num) in df.game_number.values:
            continue
        else:
            idx = numbers.index(num)
            numbers.remove(num)
            games.pop(idx)
            loop = True
            num=''
            break

while loop:
    remove_games()

Ответы [ 2 ]

0 голосов
/ 23 июня 2019

Один из способов сделать это - использовать разницу наборов :

nums = set(map(int, numbers))
nums -= df.game_number

Единственная потенциальная проблема здесь заключается в том, что set не является упорядоченной коллекцией. Вы можете перебирать nums, но порядок произвольный. Если числа изначально имели важный порядок, вы можете использовать dict вместо set с CPython 3.6 (где это все еще была «деталь реализации», полностью принятая в 3.7). Для предыдущих версий вы можете использовать collections.OrderedDict:

nums = dict.from_keys(map(int, numbers))
numbers = list(nums.keys() - df.game_number)
0 голосов
/ 23 июня 2019

Ваш loop в remove_games является локальной переменной. Я не уверен, в какой версии Python это может работать, но объявление global loop в remove_games должно дать вам поведение, которое вы хотите.

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

def remove_games():
    for num in numbers:
        if int(num) in df.game_number.values:
            continue
        else:
            idx = numbers.index(num)
            numbers.remove(num)
            games.pop(idx)
            num=''
            return True
    return False


while remove_games():
    pass
...