Циклические и/или условные операторы при каждом запуске выдают разные значения

#python #loops #conditional-statements

Вопрос:

У меня есть этот цикл, который считывает файл из папки, значения которой затем помещаются в список. Содержимое этого списка затем сравнивается с другим списком, в котором операция будет выполняться на основе наличия содержимого в другом списке. Теперь у меня есть проблема с выполняемыми операциями. Операции иногда срабатывают, но в большинстве случаев результаты бывают случайными. Он выполняет некоторые операторы if и elif больше, чем требуется, поэтому я бы предположил, что это как-то связано с приведенными ниже условными операторами. Однако на данный момент я не могу понять, почему это происходит.

 pair = {}
bag = []
new = []
os.chdir(classPath)              
for file in os.listdir():
    prod = Decimal(1)
    bag2 = []
    if file.endswith(".txt"):
        file_path = f"{classPath}{file}"
        input = readFile(file_path)
        for i in list(set(input)):
            bag2.append(re.sub(r'[^a-zA-Z0-9]', '', i))
            for j in list(set(bag2)):
                count1 = Decimal(0)
                op = Decimal(0)
                if j in bag:
                    count1 = Decimal(count1   1)
                    op = Decimal(count1   2) / ((len(bag))   (2 * (len(list(set(dict())))   len(new))))
                    prod = Decimal(prod * op)
                elif j not in bag:
                    op = Decimal(count1   2) / ((len(bag))   (2 * (len(list(set(dict())))   len(new))))
                    print('hello')
                    prod = Decimal(prod * op)
            pair[file] = prod
 

например, файл содержит слово hello hi
список 2 содержит yes no . Поскольку hello и hi не существуют в другом списке, операторы elif должны быть выполнены дважды.

 def spamCount():
bagInput = []
os.chdir(spamPath)  
for file in os.listdir():
    if file.endswith(".txt"):
        file_path = f"{spamPath}{file}"
        inputs = readFile(file_path)
        bagInput.append(inputs)

return list(chain(*bagInput))
 

список сумок берется из этой функции

 a = spamCount()
    for i in (a):
    bag.append(re.sub(r'[^a-zA-Z0-9]', '', i))
 

Комментарии:

1. Что это такое: (len(list(set(dict()))) ?

2. ах, извините, забыл упомянуть об этом. это просто длина списка из другой функции. его значение равно 7.

3. Подождите, len(list(set(dict()))) всегда равно 0.

4. ну, если вы не переопределили встроенный дикт, dict() выдаст вам пустой дикт, который выдаст пустой набор, пустой список и его длина будет равна 0

5. У вас есть условие (если j в сумке ( сделайте что-нибудь), если j нет в сумке (сделайте что-нибудь еще). Что может произойти, так это то, что, когда речь заходит о другой части, данные могут иметь два условия. Где данных нет в сумке, и их тоже нет в сумке. Это может произойти, если данные равны нулю. Вы можете попробовать (если j нет в сумке, еще что-нибудь сделайте)

Ответ №1:

 for file in os.listdir():
    prod = Decimal(1)
    bag2 = []
    if file.endswith(".txt"):
        file_path = f"{classPath}{file}"
        inputs = readFile(file_path)
        for i in list(set(inputs)):
            bag2.append(re.sub(r'[^a-zA-Z0-9]', '', i))
        for j in list(set(bag2)):
            print(j)
            count1 = Decimal(0)
            op = Decimal(0)
            if j not in bag:
                op = Decimal(count1   k) / ((len(bag))   (k * (len(list(set(dictS())))   len(new))))
                prod = Decimal(prod * op)
            else:
                count1 = Decimal(count1   1)
                op = Decimal(count1   k) / ((len(bag))   (k * (len(list(set(dictS())))   len(new))))
                prod = Decimal(prod * op)
        pair[file] = prod
 

как оказалось, третий цикл for в этом фрагменте проходит по списку, даже если он еще не завершен. Выполнение цикла после завершения bag2.append-это исправление, которое я сделал.