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