Как хранить словарные записи в цикле?

Я пытался получить словарь с кортежем строк, ключом целого числа из файла CSV, но у меня возникли проблемы.

Это код, который я пробовал:

fullcsv = [['Brand', 'Swap', 'Candy1', 'Candy2', 'Capacity'],
           ['Willywonker', 'Yes', 'bubblegum', 'mints', '7'],
           ['Mars-CO', 'Yes', 'chocolate', 'bubblegum', '1'],
           ['Nestle', 'Yes', 'bears', 'bubblegum', '2'],
           ['Uncle Jims', 'Yes', 'chocolate', 'bears', '5']]

def findE(fullcsv):
    i = 0
    a = {}
    while i < len(fullcsv)-1:
        i = i + 1
        a[i] = ({(fullcsv[i][2],fullcsv[i][3]): int(fullcsv[i][4])})
    return a

Это вывод для этого фрагмента кода:

{1: {('bubblegum', 'mints'): 7},
 2: {('chocolate', 'bubblegum'): 1},
 3: {('bears', 'bubblegum'): 2},
 4: {('chocolate', 'bears'): 5}}

Но результат, который я ищу, больше похож на этот:

{('bubblegum', 'mints'): 7,
 ('chocolate', 'bubblegum'): 1,
 ('bears', 'bubblegum'): 2,
 ('chocolate', 'bears'): 5}

чтобы кортежи не нумеровались и тоже не в своих {}, а просто в скобках ().

Легче перебирать csv с помощью for row in fullcsv:[1:], а не с помощью индекса i. Код будет выглядеть менее сложным.

Peter Wood 06.05.2022 09:22

Если вы можете попробовать, измените эту строку a[i] = ({(fullcsv[i][2],fullcsv[i][3]): int(fullcsv[i][4])}) на a[(fullcsv[i][2],fullcsv[i][3])]=int(fullcsv[i][4] в своем коде.

Deepak Tripathi 06.05.2022 09:23
Почему в 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 может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
2
30
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

внутри функции вам нужно установить пару значений ключа словаря следующим образом

a[(fullcsv[i][2],fullcsv[i][3])] = int(fullcsv[i][4])

так что полная функция

def findE(fullcsv):
    i = 0
    a  = {}
    while i < len(fullcsv)-1:
        i = i + 1
        a[(fullcsv[i][2],fullcsv[i][3])] = int(fullcsv[i][4])
            
    return a

общий синтаксис

dictionary[new_key] = new_value

Вот немного другой способ, если хотите.

def findE(fullcsv):
    new_dict = {}
    for entry in fullcsv[1:]:
        new_dict[(entry[2],entry[3])] = entry[-1]
    return new_dict

Ницца. Вы можете сократить это до: return {(e[2], e[3]): int(e[-1]) for e in fullcsv[1:]}.

Peter Wood 06.05.2022 09:26

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