假设我有一个函数get_call_value(row, column)
,它返回电子表格单元格的值。我有一组与列对应的标签。我想建立一个字典列表,其中的键是列标签。这就是我到目前为止所拥有的:
def _get_rows(self, start_key=1):
# List holding lists representing rows
out_data = []
# Get row count
row_count = num_rows()
column_count = num_columns()
def get_label_value(row, column):
"""Generator for getting the cell value at row, column of an Excel sheet
"""
labels = {
0: 'label_1',
1: 'label_2',
2: 'label_3',
}
yield (labels[column], get_cell_value(row, column))
return {key: value for (key, value) in get_label_value(xrange(start_key, row_count), xrange(column_count))}
我的堆栈跟踪以错误结束:
get_label_value
yield (labels[column], get_cell_value(row, column))
KeyError: xrange(31)
我显然不了解发电机应该如何工作。有人能告诉我我做错了什么吗?谢谢!
编辑: 我认为需要进一步澄清,我看到我的逻辑中有关我想做什么的错误。我的预期结果是一个词典列表。字典中的键是列标签,值是(行,列)的单元格值,如下所示:
[
{'label_1': value_1,
'label_2': value_2,
'label_3': value_3,
},
{
'label_1': another_value_1,
...
}
]
考虑到这一点,我的退货声明应该是这个吗?
在get_label_value中返回[{key:值为(键,值)(xrange(start_key,row_count),xrange(column_count))}]
答案 0 :(得分:1)
您现在正试图将整个xrange
对象传递给labels
dict,这就是您看到异常的原因。您实际想要做的是迭代您传递给xrange
的两个get_label_value
对象,以便您可以构建所需的dicts列表:
def _get_rows(self, start_key=1):
# List holding lists representing rows
out_data = []
# Get row count
row_count = num_rows()
column_count = num_columns()
def get_label_value(rows, columns):
"""Generator for getting the cell value at row, column of an Excel sheet
"""
labels = {
0: 'label_1',
1: 'label_2',
2: 'label_3',
}
# Yield a dict for each row in the table. The dict contains all the
# cells for a given row in the table, where the keys are column labels,
# each mapped to a given cell in the row.
for row in rows:
yield {labels[column] : get_cell_value(row, column) for column in columns}
return [cell_dict for cell_dict in get_label_value(xrange(start_key, row_count), xrange(column_count))]