@stepantu

Не переходит в цикл, хотя условия выполнены. Где ошибка?

import random
import sys


def print_mimic(mimic_dict, word):
    bred = []
    x = 0
    while x < 200:
        if x == 0:
            first = word                                                          ### В это части цикла всё хорошо
            dobav = random.choice(mimic_dict[first]) 
            bred.append(dobav)
            x += 1
        else:
            print (dobav in mimic_dict)
            if dobav in mimic_dict == True:                              ### А вот тут проблема. Строчка 
                dobav = random.choice(mimic_dict[dobav])      ### выше выдает True но почему  то в цикл if  
                bred.append(dobav)                                          ### не переходит, а соскакивает 
                x +=1                                                                 ### в else. Как такое 
            else:                                                                ### может быть? Спасибо
                dobav = random.choice(mimic_dict[" "])
                bred.append(dobav)
                x += 1



    print (bred)
    return bred
    
mimic_dict = {" " : ["A", "B" , "C"], 
                      "A" : ["1", "2" "3"],
                      "B" : ["4", "5" "6"], 
                      "C" : ["7", "8" "9"]   }
print_mimic(mimic_dict, " ")
  • Вопрос задан
  • 272 просмотра
Решения вопроса 1
@idap
интересуюсь python, latex, linux, ML, AI
Приоритет операций нужно учитывать, видимо:
1 in (1, 2, 3) == True
даст False, поскольку сначала выполнится (1, 2, 3) == True, что вернёт False, и затем получится проверка 1 in False, что есть False.
А вот так правильно:
(1 in (1, 2, 3)) == True
даст True.
А вот так ещё правильнее:
if 1 in (1, 2, 3):
    pass
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
trapwalker
@trapwalker Куратор тега Python
Программист, энтузиаст
В исходном коде много странных мест. Например, странным и опасным образом опущенны запятые в описании словаря, опасное применение переменной dobav в ветке else... Это всё ведёт к небезопасному коду в плане понимания и будущих модификаций. Очевидна нехватка опыта.

Насчет приоритета операций вам уже ответили, но давайте попробуем провести поэтапный для ясности рефакторинг вашего кода.
Вот чему эквивалентно тело вашей функции:
def print_mimic(mimic_dict, word):
    bred = []
    x = 0
    dobav = word
    while x < 200:
        if x == 0 or dobav in mimic_dict:
            dobav = random.choice(mimic_dict[dobav])
        else:
            dobav = random.choice(mimic_dict[" "])
        bred.append(dobav)
        x += 1
    print (bred)
    return bred

Я понятия не имею что это за код и для чего он. Предыдущий рефакторинг я сделал оставив код эквивалентным исходному (за исключением исправления очевидных ошибок). Можно предположить, что в коде есть ещё ряд логических ошибок. Возможно поведение по ветке "x == 0" не должно отличаться от поведения по ветке else условия "dobav in mimic_dict", а вместо константы " " следовало тоже поставить word. Тогда код становится гораздо более простым, понятным и элегантным.
def print_mimic(mimic_dict, word):
    bred = []
    dobav = word
    for x in range(200):
        dobav = random.choice(mimic_dict.get(dobav, mimic_dict[" "])) 
        bred.append(dobav)

    print (bred)
    return bred
Ответ написан
AnnTHony
@AnnTHony
Интроверт
if dobav in mimic_dict == True:
>>> False
if (dobav in mimic_dict) == True:
>>> True
Ответ написан
Комментировать
@abcd0x00
if dobav in mimic_dict == True:

if dobav in mimic_dict:
И всё.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы