1

[Python 3.1]

编辑:原始代码中的错误。

我需要打印一张桌子。第一行应该是一个标题,它由制表符分隔的列名组成。以下行应包含数据(也是制表符分隔的)。

为了澄清,假设我有列“速度”、“功率”、“重量”。在我之前提出的相关问题的帮助下,我最初编写了以下代码:

column_names = ['speed', 'power', 'weight']

def f(row_number):
  # some calculations here to populate variables speed, power, weight
  # e.g., power = retrieve_avg_power(row_number) * 2.5
  # e.g., speed = math.sqrt(power) / 2
  # etc.
  locals_ = locals()
  return {x : locals_[x] for x in column_names}

def print_table(rows):
  print(*column_names, sep = '\t')
  for row_number in range(rows):
    row = f(row_number)
    print(*[row[x] for x in component_names], sep = '\t')

但后来我了解到我应该尽可能避免使用locals().

现在我被困住了。我不想多次键入所有列名的列表。我不想依赖这样一个事实,即我在其中创建的每个字典f()都可能以相同的顺序遍历其键。而且我不想使用locals().

注意功能print_table()f()做很多其他的东西;所以我必须把它们分开。

我应该如何编写代码?

4

3 回答 3

2
class Columns:
    pass

def f(row_number):
    c = Columns()
    c.power = retrieve_avg_power(row_number) * 2.5
    c.speed = math.sqrt(power) / 2
    return c.__dict__

这还允许您指定哪些变量作为列,而不是在函数中是临时的。

于 2010-11-01T08:44:37.243 回答
0

您可以使用OrderedDict来修复字典的顺序。但在我看来,这甚至没有必要。您总是从column_names列表中获取键(最后一行除外,我认为这是一个错字),因此值的顺序将始终相同。

于 2010-11-01T08:29:42.873 回答
0

locals() 的替代方法是使用检查模块

import inspect

def f(row_number):
    # some calculations here to populate variables speed, power, weight
    # e.g., power = retrieve_avg_power(row_number) * 2.5
    # e.g., speed = math.sqrt(power) / 2
    # etc.
    locals_ = inspect.currentframe().f_locals
    return {x : locals_[x] for x in column_names }
于 2010-11-01T08:38:09.963 回答