Я новичок в использовании словаря 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 во время циклических вызовов. Или есть лучший способ достичь моей цели?
да. точно. Я обновил вопрос, указав немного больше моего кода.
для ключа = 100 должно быть [карандаш, яблоко, лимон, ...]?
Если вы имеете в виду то, что я хочу, чтобы мой окончательный результат был, то это 100: [карандаш, баскетбольный мяч, апельсин, лимон]. Пробуемая часть является его составной частью. как вы можете видеть, «апельсин» и «лимон» являются частью конечных значений ключа «100»





Здесь можно просто использовать вложенные циклы. Внешний цикл будет перебирать строки и добавлять новое значение для каждой строки, в то время как внутренний цикл будет перебирать 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 внутри цикла, и это работает, спасибо.
так что для записей с одним и тем же ключом значения будут просто добавлены?