使用字典理解来构建复杂的字典

时间:2018-03-27 05:20:36

标签: python dictionary-comprehension

这是python编程的问题。

我正在尝试通过从excel导入数据来构建一个字典来进行分析。

我的字典结构是:

dict = { sheet_name : 
                  {label_name1 : [['datatype'],['','',some_data.....]],      
                   label_name2 : [['datatype'],['','',some_data.....]],
                   ...
                  }
         sheet_name1 :
                  {label_name3 : [['datatype'],['','',some_data.....]],      
                   label_name4 : [['datatype'],['','',some_data.....]],
                   ...
                  }
       }

现在我使用xlrd来处理读数据。

file = xlrd.open_workbook(filename)

table_names = file.sheet_names()    

label = sum([file.sheet_by_name(names).row_values(0) for names in
         table_names], [])

SHEET_DICT = {names: {labels: [['unknown_datatype'], 
                               file.sheet_by_name(names)\
                                   .col_values(i for i \
                                   in file.sheet_by_name(names).ncols))]
                       for labels in label}               
              for names in table_names }

我收到错误消息:

  
    

回溯(最近一次调用最后一次):文件" C:/Users/panze/PycharmProjects/Harvest/main.py",第92行,在         test = read_excel(EXCELFILE)File" C:/Users/panze/PycharmProjects/Harvest/main.py" ;,第73行,in     read_excel         对于table_names中的名称}文件" C:/Users/panze/PycharmProjects/Harvest/main.py" ;,第73行,在              table_names中的名称}文件" C:/Users/panze/PycharmProjects/Harvest/main.py" ;,第72行,in              标签中的标签}

  
     

TypeError:' int'对象不可迭代

> file.sheet_by_name(names).col_values(0) is right 

> file.sheet_by_name(names).col_values(1) is right

当我尝试使用变量时

file.sheet_by_name(names).col_values(i for i in range(29)) 

这是错误的。

然而我需要它可迭代,以便我可以建立一个正确的词典。

还有其他办法吗?

我真的要用dict理解来做这种方式...

感谢您的帮助

1 个答案:

答案 0 :(得分:1)

根据the docs

col_values(colx, start_rowx=0, end_rowx=None)
  

返回给定列中单元格值的切片。

所以,你不能传递像i for i in range(29)这样的迭代(顺便说一下,这只是一种更简洁,更慢的方式来获得与range(29)相同的值),你传递一个列号,开始行和结束行。

如果您想获得第0列,第1列,第2列等的列表,您可以这样做:

[file.sheet_by_name(names).col_values(i) for i in range(29)]

如果您正在尝试仅为特定行获取第0列,第1列等的列表,则可以使用row_values函数,传递行号,然后是开始和结束专栏。