使用生成器创建带有一组标签的词典列表

时间:2014-09-25 02:06:08

标签: python dictionary generator

假设我有一个函数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))}]

1 个答案:

答案 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))]