1

【パイソン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

locals()の代わりに、inspectモジュールを使用することもできます

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 に答える
0

OrderedDictを使用して、辞書の順序を修正できます。しかし、私が見る限り、それは必要でさえありません。常にcolumn_namesリストからキーを取得しているため (最後の行を除いて、タイプミスだと思います)、値の順序は常に同じになります。

于 2010-11-01T08:29:42.873 に答える