1

我有一个 XLS 表,我正在用 python 解析,目前我用一个作为键 (line_number,column_number) 的哈希来表示它——实际上我使用的是其他标识符,但为了简单起见,这可以解释这种情况.

现在,假设我有兴趣获取该表的给定行,我正在使用:

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

换句话说,我正在访问每个单元格并验证其线路,这似乎不是最好的方法。在这一点上,我不确定使用带有部分键的哈希是否是最好的方法。当然,使用数据库可能是最好的选择,但鉴于我的数据集非常小,我宁愿让程序保持简单,只在内存中使用它。因此,我的问题缩小到:

  1. 有没有更好的方法来表示 python 上的内存表?
  2. 我将如何从中获得一条线?(给出最好的表示)

我希望这个问题是相关的。我找不到合适的关键字来搜索这个问题。

谢谢你。

4

3 回答 3

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 回答
0

我使用数组和列表存储了内存表,您可以根据位置调用特定项目:

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

你考虑过吗?

于 2012-08-19T04:38:53.150 回答
0

我会修改Dugres的答案,以便按行提供对表的访问,更有效地使用内存并尝试更自然地使用 dict 类。在此示例中,行键来自一个简单的数字枚举,从 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 回答