Перебор списка с предложением while и значениями, не исключенными с помощью list.remove - PullRequest
1 голос
/ 14 апреля 2020

Я запускаю код для очистки базы данных. В основном, если какое-либо значение появляется в списке, его следует удалить.

Ниже вы можете увидеть код:

    pattern = re.compile("((?:\d{10}|\d{9}|\d{8}|\d{7}|\d{6}|\d{5}|\d{4})(?:-?[\d]))?(?!\S)")
    cc = pattern.findall(a)
    print("cpf:", cpf)
    print("ag:", ag)
    print("cc start:",cc)
    for i in cc:
        print("i:",i)
        try:
            while i in ag: cc.remove(i)
        except:pass
        try:
            while i in cpf:cc.remove(i)
        except:pass
        try:
            while "" in i:cc.remove(i)
        except:pass
    print("final cc:",cc)

Он выводит на моем экране следующее:

cpf: ['00770991092']
ag: 3527
cc start: ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '00770991092', '', '', '', '', '', '', '', '', '01068651-0', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '']
i: 
i: 01068651-0
final cc: ['00770991092']

Ну, значения '' удалены, кажется, что они работают нормально. Однако, поскольку «00770991092» является значением внутри cpf, его следовало удалить, но это не так. В "final cc" это значение, которое я получаю, и оно должно быть '01068651-0'.

Даже если я запусту эту проверку: if cc в cpf: print (True) It подтверждает, что это правда.

Чего мне не хватает?

PS .: Я нахожу весьма интригующим, что когда я print(i) внутри предложения, появляются только два значения (и одно пустое) .

1 Ответ

1 голос
/ 14 апреля 2020

Изменение списка во время его перебора не очень хорошо работает. Является ли создание нового списка вариант? Что-то вроде:

filtered_cc = [
    i for i in cc
    if not (i in ag or i in cpf or i == "")
]
...