1

私はpythonで解析しているXLSテーブルを持っています。現在、キー(line_number、column_number)として持つハッシュでそれを表しています-実際には他の識別子を使用していますが、簡単にするために、これは状況を説明するのに役立ちます.

ここで、このテーブルの特定の行を取得することに興味があるとします。使用しているのは次のとおりです。

for k, v in self.table.iteritems():
    if k[0] == '1': 
        # do whatever

言い換えれば、私はすべてのセルにアクセスしてその行を確認していますが、これは最善の方法とは思えませんでした。部分キーでハッシュを使用することが最善の方法であるかどうかは、現時点ではわかりません。もちろん、データベースを使用するのがおそらく最良の選択肢ですが、私のデータセットが非常に小さいことを考えると、プログラムを単純にして、メモリ上で作業するだけにしたいと思います。したがって、私の質問は次のように絞り込まれます。

  1. Pythonでメモリ上のテーブルを表現するより良い方法はありますか?
  2. そこからラインを取得するにはどうすればよいですか?(最良の表現が与えられた場合)

質問が適切であることを願っています。この問題を検索するための適切なキーワードを見つけることができませんでした。

ありがとうございました。

4

3 に答える 3

0

行ごとにテーブルへのアクセスを提供し、メモリをより効率的に使用し、dictクラスをより自然に使用しようとするために、Dugresの回答を変更します。この例では、行キーは0から数えて単純な数値列挙からのものです。

columns = ['col1', 'col2']
table = [
    ['abc', 123],
    ['def', 456],
    ['ghi', 123],
]

# build view from a comprehension
view = {i: {columns[j]: table[i][j] for j in range(len(columns))} for i in range(len(table))}

# build view procedurally
view = dict()
for i, row in enumerate(table):
    view[i] = dict()
    for j, col in enumerate(row):
        view[i][columns[j]] = col

# view contents
view
{0: {'col2': 123, 'col1': 'abc'}, 
1: {'col2': 456, 'col1': 'def'}, 
2: {'col2': 123, 'col1': 'ghi'}}


# Cell by row and column
>>> view[0]['col1']
'abc'

# List of cells for row 0:
>>> [view[0][col] for col in columns]
['abc', 123]

# All cells in col2:
>>> [view[row]['col2'] for row in sorted(view.keys())]
[123, 456, 123]

# All rows with value 123 in col2, using a list generator expression
[[view[row][column] for column in columns] for row in view.keys() for col in columns if view[row][col] == 123]
[['abc', 123], ['ghi', 123]]


# All rows with value 123 in col2, using a list generator function
def rowGenerator(view, col, value):
    for row in view.keys():
    if view[row][col] == value:
        yield [view[row][colName] for colName in columns]

>>> [row for row in rowGenerator(view, 'col2', 123)]
[['abc', 123], ['ghi', 123]]
于 2012-08-20T03:19:14.257 に答える
0

位置に基づいて特定のアイテムを呼び出すことができる配列とリストを使用して、メモリ内テーブルを保存しました。

array = [
  ['John', 19, 'male'], 
  ['Sara', 22, 'female'] 
]

あなたはそれを考慮しましたか?

于 2012-08-19T04:38:53.150 に答える
0
from collections import defaultdict

columns = ['col1', 'col2']
table = [
    ['abc', 123],
    ['def', 456],
    ['ghi', 123],
]

view = dict((name, defaultdict(list)) for name in columns)
for row in table:
    for i, col in enumerate(row):
        name = columns[i]
        view[name][col].append(row)

print view['col1']['abc']
print view['col2'][123]
于 2012-08-19T09:13:27.587 に答える