Python 使用生成器创建带有一组标签的词典列表
假设我有一个函数Python 使用生成器创建带有一组标签的词典列表,python,dictionary,generator,Python,Dictionary,Generator,假设我有一个函数get\u call\u value(行、列),它返回电子表格单元格的值。我有一组与列相对应的标签。我想建立一个字典列表,其中的键是列标签。以下是我目前掌握的情况: def _get_rows(self, start_key=1): # List holding lists representing rows out_data = [] # Get row count row_count = num_rows() column_count
get\u call\u value(行、列)
,它返回电子表格单元格的值。我有一组与列相对应的标签。我想建立一个字典列表,其中的键是列标签。以下是我目前掌握的情况:
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,
...
}
]
考虑到这一点,我的返回语句应该是这样的吗
返回[{key:value for(key,value)在get_label_value(xrange(start_key,row_count),xrange(column_count))}]您现在正试图将整个
xrange
对象传递给labels
dict,这就是您看到异常的原因。实际上,您要做的是迭代传递给get\u label\u value
的两个xrange
对象,以便构建所需的dict列表:
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))]
预期的结果是什么?你希望xrange做什么?达诺,我编辑了我的问题;我不认为我的期望结果是清楚的。这是有效的,除了生产线中的逗号应该是冒号。所以,如果它不超过六个字符,出于某种原因,就不允许我编辑它。@ericso谢谢,我已经解决了这个问题。很高兴它能为您工作。另一个问题:如果我想在正在生成的字典中添加一个键值对,该怎么办?我想加上{'row_number':row}。我能想到的最接近的事情是在yield语句中使用update(),但update()不返回任何值。想法?@ericso只是不直接从听写理解中让步,而是将它分成三行:
d={labels[column]:…};d['row_number']=行;产量d