我在PyTables中使用了itersorted方法。将步长设置为正值时,将正确返回所有行,但使用负步长值时,不返回第一行。使用负步长值时如何获取完整的行集?
以下是显示问题的测试代码:
import tables
class DBEntry(tables.IsDescription):
id = tables.Int16Col()
class Test(object):
def __init__(self, parent = None):
pass
def create_db_entries(self):
db = tables.open_file("py_db_test.h5", mode = "w", title = "db")
table = db.create_table('/', 'test', DBEntry, "test")
entry = table.row
for i in range(0, 5):
entry['id'] = i
entry.append()
table.flush()
table.cols.id.create_csindex()
db.close()
def get_db_entries(self):
db = tables.open_file("py_db_test.h5", mode = "r")
entries = db.root.test
print('ascending (all rows showing)')
for row in entries.itersorted('id', start = None, stop = None, step = 1):
print(row['id'])
print('decending (missing first row)')
for row in entries.itersorted('id', start = None, stop = None, step = -1):
print(row['id'])
db.close()
if __name__ == '__main__':
test = Test()
test.create_db_entries()
test.get_db_entries()
答案 0 :(得分:1)
这是一个有趣的问题。我在您的代码中添加了def
,以测试table.read_sorted()
和step=-1
的行为。可以按预期工作(您将数组按降序排序:[(4,) (3,) (2,) (1,) (0,)]
。
请注意,start= and stop=
是索引中的位置,而不是行号。请参阅此SO Q&A进行讨论:
Is it possible to reverse lookup the index position for itersorted in PyTables?
我无法解释为什么itersorted('id', step = -1)
缺少第一行,也许是一个错误?
如果确实需要按降序排列的所有元素,则可以将索引值用作行迭代器。将此代码添加到您的def get_db_entries(self):
print('decending (using csi index to order)')
print (entries.cols.id.index.read_indices(step = -1))
for id in entries.cols.id.index.read_indices(step = -1):
print(entries[id][0])