2017-10-12 56 views
-2

我有一个Excel工作表,我想创建一个字典值的单元格值列表与细胞列是关键。让说,电子表格有看起来像数据,Pythonic的方式来创建一个Excel列字段的字典

A B C (columns) 
1 2 
3 4 
5 f 

我想要一个字典,看起来像,

cbyc = {'A': [1,3,5]; 'B':[2,4,f]; 'C';[None, None, None]} 

我用下面的代码

import openpyxl as oxl 
wb = oxl.load_workbook('myxlworkbook.xlsx') 
sheet = wb.get_sheet_by_name('Sheet1') 
allcells = sheet.get_cell_collection() 

cbyc = {} 
for c in allcells: 
    if c.value is not None: 
     if c.column not in cbyc.keys(): 
      cbyc[c.column] = [c.value] 
     else: 
      cbyc[c.column].append(c.value) 

这项工作做这,但我相信有一个更有效的方式来创建此词典与if .. else逻辑

是否有一个 更好的方法?也许有什么东西在openpyxl可以给出这样的一个列表

+0

看起来像你需要'cbyc = collections.defaultdict(list)' –

+1

'如果c.column不在cbyc.keys()'中就太可怕了。 –

+0

我正在重新打开,因为Rob答案没有使用任何defaultdict或setdefault。 –

回答

4

每当我看到一个难看的循环填充dictlist,我尝试用dict理解或列表理解来替换它。在这种情况下,我会使用两者。

这个程序可能会做你想要什么:

import openpyxl as oxl 
wb = oxl.load_workbook('myxlworkbook.xlsx') 
sheet = wb.get_sheet_by_name('Sheet1') 

cybc = { 
    col[0].value: [cell.value for cell in col[1:]] 
    for col in sheet.columns 
} 

print(cybc) 

然而,我们就能避免所有.value代码的,如果我们调用sheet.values入手:

cybc = { col[0]: col[1:] for col in zip(*sheet.values) } 
1

您可以更换:

if c.column not in cbyc.keys(): 
    cbyc[c.column] = [c.value] 
else: 
    cbyc[c.column].append(c.value) 

有:

cby.setdefault(c.column, []).append(c.value) 
setdefault(key[, default]) 

如果关键是在字典中,返回它的价值。如果没有,则插入具有默认值的键并返回默认值。默认默认为None。

请参阅docs

1
from collections import defaultdict 

cbyc = defaultdict(list) 

for cell in all_cells: 
    if cell.value is None: 
     continue 
    cbyc[cell.column].append(cell.value) 

参见documentation on defaultdict

相关问题