我是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跟随。这意味着当val3下的列中有一个条目时,将考虑val2。并且在在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字典中使用update函数。还是有更好的方法实现我的目标?
答案 0 :(得分:0)
您可以在此处使用嵌套循环。外循环将遍历行,并为每行添加一个新值,而内循环将遍历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)