Создание словаря python из таблицы excel

Я новичок в использовании словаря Python. Почти всегда указывается, что они являются хорошей альтернативой использованию динамических списков или многомерных массивов. Моя идея состоит в том, чтобы подготовить главный словарь, объединив 3 словаря с похожими ключами. Сложность заключается в чтении данных с листа excel на основе некоторых сравнений.

+------+------------+----------+----------+
| keys |    val1    |   val2   |   val3   |
+------+------------+----------+----------+
|  100 | football   |  apple   | pencil   |
|  200 | baseball   | <NoVal2> | pen      |
|  100 | basketball | <NoVal2> | <NoVal3> |
|  100 | rugby      | orange   | <NoVal3> |
|    0 | cricket    | grapes   | <NoVal3> |
|  100 | hockey     | lemon    | <NoVal3> |
|  200 | tennis     | <NoVal2> | desk     |
+------+------------+----------+----------+

Я хочу создать главный словарь с рангами 0, 100 и 200 в следующем формате:

0:      [grapes]
100:    [pencil, basketball, orange, lemon]
200:    [pen, desk]

Где val3 имеет наивысший ранг, за которым следуют val2 и val1. Это означает, что при наличии записи в столбце под знач.3 учитывается знач.2. И когда обнаруживается в столбце val2, считается val1 (наименьший приоритет).

import xlrd

workbook_read = xlrd.open_workbook('random_data.xlsx')
sheets = workbook_read.sheets()
worksheet = sheets[0]

master_keys = []

col = 0
for row in range(worksheet.nrows):
    if row > 0:
        master_keys.append(str(worksheet.cell_value(row, col)))

master_keys = list(set(master_keys))

dict_val1 = {}
dict_val2 = {}
dict_val3 = {}


for row in range(worksheet.nrows):
    if str(worksheet.cell_value(row, 3)) == "<NoVal3>":
        if str(worksheet.cell_value(row, 2)) == "<NoVal2>":
            key = '{}'.format(str(worksheet.cell_value(row, 0)))
            dict_val1.update({key:str(worksheet.cell_value(row, 1))})   # Val1
        else:
            key = '{}'.format(str(worksheet.cell_value(row, 0)))
            dict_val2.update({key:str(worksheet.cell_value(row, 2))})   # Val2
            print(dict_val2)
    else: 
        if row is not 0:
            key = '{}'.format(str(worksheet.cell_value(row, 0)))
            dict_val3.update({key:str(worksheet.cell_value(row, 3))})   # Val3 

Например, результат печати, который я получаю:

 - {'100.0': 'orange'} 
 - {'100.0': 'orange', '0.0': 'grapes'}
 - {'100.0': 'lemon', '0.0': 'grapes'}

Если бы я мог обновить «лимон» как список до «100», в результате я мог бы получить требуемый словарь компонентов. Я не уверен в использовании функции обновления в словаре python во время циклических вызовов. Или есть лучший способ достичь моей цели?

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

Lex Bryan 12.03.2019 09:26

да. точно. Я обновил вопрос, указав немного больше моего кода.

abk 12.03.2019 10:04

для ключа = 100 должно быть [карандаш, яблоко, лимон, ...]?

Lex Bryan 12.03.2019 10:08

Если вы имеете в виду то, что я хочу, чтобы мой окончательный результат был, то это 100: [карандаш, баскетбольный мяч, апельсин, лимон]. Пробуемая часть является его составной частью. как вы можете видеть, «апельсин» и «лимон» являются частью конечных значений ключа «100»

abk 12.03.2019 10:11
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
64
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Здесь можно просто использовать вложенные циклы. Внешний цикл будет перебирать строки и добавлять новое значение для каждой строки, в то время как внутренний цикл будет перебирать 3 возможных значения, сохраняя лучшее из них.

master_dict = collections.defaultdict(list)
for row in range(1, sheet.nrows):
    best = None
    for col in range(1, 4):
        if not str(worksheet.cell(row, col).value).startswith("<NoVal"):
            best = worksheet.cell(row, col).value
    master_dict[str(worksheet.cell(row, 0).value)].append(best)

Этот код работает аккуратно, за исключением того, что в моем листе Excel также есть другие столбцы между ними. По этой причине мне пришлось указывать номера столбцов во время операторов сравнения. Теперь я указал точное поле столбца для сравнения, используя оператор if внутри цикла, и это работает, спасибо.

abk 12.03.2019 11:02

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