Создает новый словарь, состоящий из другого ключа словаря и двух переменных

Я хотел бы создать словарь, состоящий из key (ключ словаря x), Calc_1 и Calc_2

Как видите, уже есть более старый словарь под названием x (x не важен для целей вопроса). Словарь x генерирует Calc_1 и Calc_2 для каждого из своих ключей. Это работает правильно.

Теперь я хотел бы сгруппировать переменные Calc_1 и Calc_2 и каждую соответствующую key в новый словарь. Поэтому я хотел бы создать словарь newdict, содержащий key, (ключ словаря x) и Calc_1 и Calc_2. Как я могу?

newdict = {}

for key, value in x.items():
    Calc_1= sum(value[4]) / len(value[4])
    Calc_2 = (Calc_1 *100) / 2
  
    if Calc_1 > 0.5:
        if key not in newdict:
            newdict[key] = list([key, Calc_1, Calc_2])
            newdict[key][Calc_1] = [newdict[key][Calc_1]]
        else:
            newdict[key][Calc_1].append(Calc_2)

print(newdict)

Я получаю ошибку TypeError: list indices must be integers or slices, not float, но наверняка проблема будет в другом

Это может значительно помочь узнать, чего вы надеетесь достичь. Как бы то ни было, в этом есть запах проблемы XY.

Chris 10.01.2023 03:25

@Chris Я надеюсь получить второй словарь с тремя элементами. Ключ, который будет ключом словаря x, и два значения, которые будут Calc_1 и Calc_2.

user20812299 10.01.2023 03:28

Да, но почему вопрос, который я задаю.

Chris 10.01.2023 03:28
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
3
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Calc_1 — это среднее, рассчитанное ранее, поэтому это float, который нельзя использовать в качестве индекса списка.

Но нет причин, по которым вы должны индексировать newdict[key] в первую очередь. Это просто список из 3 элементов, которые вы создали в предыдущей строке, зачем вам динамически его индексировать?

Просто создайте список в новом словаре. Нет необходимости в проверке if, так как ключи уникальны.

        newdict[key] = [key, Calc_1, Calc_2]

Это «все еще» словарь, который вы создали, или это список? Если да, могу ли я получить доступ к каждому из его значений в обычном режиме (3 в данном случае)?

user20812299 10.01.2023 03:24
newdict по-прежнему словарь. Его значения представляют собой списки.
Barmar 10.01.2023 03:28

Если это не так, можете ли вы обновить вопрос, чтобы показать образец ввода и желаемый результат?

Barmar 10.01.2023 03:28

Вот чего я хотел добиться :) Я проголосовал. Спасибо. Мне придется использовать этот код для тысяч и тысяч точек данных в базе данных. Я хотел использовать панд, но, честно говоря, панды не для этого случая. Так что я очень беспокоюсь о скорости работы. Я знаю, что словари более эффективны, чем списки и кортежи. Является ли мой код, который вы улучшили для меня, эффективным для тысяч точек данных, даже если значения внутри словаря являются списками? Или можно что-то написать быстрее или лучше? Спасибо

user20812299 10.01.2023 03:48

pandas подходит для строк одинакового размера, но у него есть строки переменного размера, поэтому словарь списков кажется подходящим.

Barmar 10.01.2023 06:05

Ссылка была не нужна. Так что я должен принять ваш ответ. Не волнуйтесь :) Я просто ждал вашего подтверждения, что это лучший код в моем случае. Можно ли улучшить мой код небольшими изменениями? Например удалить другое или что-то подобное? Спасибо

user20812299 10.01.2023 06:11

ЧАСТЬ 1. У меня проблема с кодом в вашем ответе. Надеюсь, вы мне ответите. Проблема вызвана else: newdict[key].append(Calc_2). Ваш код ответа содержится в флажке. Если я устанавливаю или снимаю флажок, я печатаю результаты правильно. 16 раз с сообщением Сжатый текст (65 строк). Например {'Токио-Осака': [0,5, 125,0, 125,0, 125,0 и т. д.]. 0,5 — это Calc_1, а 125,0 — это Calc_2. Как видите, он просто повторяет Calc_2. Key и Calc_1 не повторяются

user20812299 10.01.2023 22:57

ЧАСТЬ 2. Я попытался удалить else: newdict[key].append(Calc_2), и у меня больше нет этой проблемы: теперь все в порядке. Но я не знаю, правильное ли это решение. Если я удалю указанную выше строку, что произойдет с моим словарем? Зачем вставлять добавление (Calc_2), если у меня уже есть Calc_2 в [key, Calc_1, Calc_2]? Спасибо

user20812299 10.01.2023 22:58

Этот код предназначен для однократного запуска, потому что он добавляет Calc_1 только при первом создании нового ключа.

Barmar 10.01.2023 23:02

Предполагается ли, что это вложенные словари с Calc_1 в качестве ключа внутреннего словаря?

Barmar 10.01.2023 23:04

ключ словаря newdict - это «ключ», который также совпадает с ключом словаря X. Calc_1 — это не ключ, а значение. Что мне делать, чтобы решить проблему? Если я удалю else: newdict[key].append(Calc_2), проблема кажется решенной, но я не уверен, хорошо ли написан код, если я удалю else: newdict[key].append(Calc_2), или, может быть, он написан хорошо. Я не знаю. Как вы предлагаете? Мне просто нужно, чтобы newdict был словарем, состоящим из: key, Calc_1, Calc_2. Я все еще указываю, что «ключ» newdict также является тем же ключом словаря X. Спасибо

user20812299 10.01.2023 23:15

Ваш комментарий слишком длинный и бессвязный, чтобы я мог понять, в чем проблема. Ранее я просил вас обновить вопрос с примерными данными и желаемым результатом. Пожалуйста, покажите четко, что происходит не так, я не могу понять это из вашего объяснения.

Barmar 10.01.2023 23:19

Я уже получаю желаемый результат. Я упрощаю свои комментарии вопросом :) Если я удалю "else: newdict[key].append(Calc_2)", код, кажется, работает нормально, потому что у меня все еще есть Calc_2 в словаре с newdict[key] = [key , Расчет_1, Расчет_2]. Таким образом, Calc_2 существует, даже если я удалю «else: newdict [key].append (Calc_2)». ТОГДА зачем писать "else: newdict[key].append(Calc_2)", если Calc_2 уже содержится в словаре? Я могу удалить код "else: newdict[key].append(Calc_2)"?

user20812299 10.01.2023 23:25

Я только что понял, что if/else не нужен. key является ключом оригинального словаря x, поэтому они уникальны. Поскольку они не могут быть продублированы, нет необходимости проверять это.

Barmar 10.01.2023 23:28

Точно. Поэтому я просто пишу: newdict[ключ] = [ключ, Calc_1, Calc_2]?

user20812299 10.01.2023 23:32

Спасибо за редактирование ответа. Это было именно то, что я сказал. Небольшое любопытство: является ли словарь со списком внутри таким же быстрым и эффективным, как обычный словарь (без списка)? Или это медленнее?

user20812299 10.01.2023 23:43

Словарям все равно, какие значения.

Barmar 10.01.2023 23:44

Хорошо. Спасибо. Также спасибо за помощь начинающим пользователям, таким как я и другие. Простите нас, новичков, за тривиальные вопросы.

user20812299 10.01.2023 23:45

Другие вопросы по теме