Проблема при попытке вернуть ключ и значения внутри вложенного словаря

#python #dictionary #nested #nested-loops

Вопрос:

Плакат здесь в первый раз. Я пытаюсь создать простую программу преобразования на Python для проекта, над которым я работаю в рамках курса, на который я записался.

Я пытаюсь вернуть преобразование для нескольких единиц длины на основе начальной единицы. Для этого я пытаюсь использовать вложенные словари. Это должно быть через терминал CLI, поэтому мне не разрешается использовать ttinker или что-либо подобное для предоставления графического интерфейса.

Я пытаюсь вернуть его в формате:

x сантиметров в пересчете равно:

х километров
х метров
х миль и т.д.

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

x сантиметров в пересчете равно:
x
x
x
километров
метров
миль

Мой код в настоящее время выглядит так:

             len_selection = pyip.inputMenu(["Nanometre", "Micrometre", "Millimetre", "Centimetre", "Metre", "Kilometre", "Inch", "Foot", "Yard", "Mile", "Nautical Mile"], numbered=True)
            print("nEnter the number of your required unitn")
            len_value = pyip.inputNum("nPlease enter the length to convert:")

            length_conversion_factors = {
                'kilometre': {'metre': 0.001, 'centimetre': 0.00001, 'millimetre': 0.000001,
                'micrometre': 0.000000001, 'nanometre': 0.000000000001, 'mile': 1.60934,
                'yard': 0.000914397727272727, 'foot': 0.000304799242424242, 'inch': 2.53999368686869,
                'nautical mile': 1.852},

                'metre': {'kilometre': 1000, 'centimetre': 0.01, 'millimetre': 0.001, 'micrometre': 0.000001,
                'nanometre': 0.000000001, 'mile': 1609.34, 'yard': 0.914397727272727, 'foot': 0.304799242424242,
                'inch': 0.0253999368686869, 'nautical mile': 1852},

                'centimetre': {'kilometre': 100000, 'metre': 100, 'millimetre': 0.1,
                'micrometre': 0.0001, 'nanometre': 0.0000001, 'mile': 160934,
                'yard': 91.4397727272727, 'foot': 30.4799242424242, 'inch': 2.53999368686869,
                'nautical mile': 185200}}

            length_key = len_selection.lower()

            print(f"n{len_value} {len_selection}s converted equals:")

            if length_key in length_conversion_factors:
                for value in length_conversion_factors[length_key]:
                    conv_value = len_value * float(length_conversion_factors[length_key][value])
                    print(conv_value)
                for key in length_conversion_factors[length_key]:
                    print(key)
 

Я уже потратил на это полтора дня и в этот момент выдергиваю волосы.

Я пробовал что-то вроде «для ключа, значение в length_conversion_factors[length_key]:» так что все это выполняется в цикле one for, и я получаю ошибку значения, говорящую о том, что слишком много нужно распаковать. Я также попытался сначала распаковать ключи, сохранить их в переменной, а затем использовать инструкцию print, но это тоже не доставило мне радости.

Я пробовал использовать «ключ возврата» и «возвращаемое значение conv_», а затем использовать отдельный оператор печати для них, но, похоже, он вообще не работает.

Я знаю, что, вероятно, упускаю что-то очень простое. заранее большое спасибо

Ответ №1:

Python позволяет печатать более одной вещи в инструкции:

 if length_key in length_conversion_factors:
    for value in length_conversion_factors[length_key]:
        conv_value = len_value * float(length_conversion_factors[length_key][value])
        print(conv_value, value)
 

Это дает мне такой результат, как:

 1 kilometres converted equals:
0.001 metre
1e-05 centimetre
1e-06 millimetre
1e-09 micrometre
 

похоже, это то, чего вы хотели. Вы даже можете заменить заключительную инструкцию печати строкой f, аналогичной той, которая уже присутствует в коде: print(f"{conv_value} {value}s")

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

1. Огромное спасибо…. Я не могу поверить, что после всего этого все было так просто. Я пытался использовать ключ в инструкции печати при предыдущей попытке, но никогда не думал об использовании значения. Ты спас то, что осталось от моих зубов после бесчисленных часов скрежета!