从Excel表制作python字典

时间:2019-03-11 18:09:53

标签: python-3.x dictionary

我是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函数。还是有更好的方法实现我的目标?

1 个答案:

答案 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)