Почему PyTables не возвращает первую строку при использовании ее сортировки с отрицательным шагом? - PullRequest
0 голосов
/ 11 июня 2019

Я использую метод itersorted в PyTables. Все строки возвращаются правильно, когда для шага установлено положительное значение, но первая строка не возвращается при использовании отрицательного значения шага. Как получить полный набор строк при использовании отрицательного значения шага?

Вот некоторый тестовый код, который показывает проблему:

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()

1 Ответ

1 голос
/ 11 июня 2019

Это интересная проблема. Я добавил def в ваш код, чтобы проверить поведение table.read_sorted() с step=-1. Это работает как ожидалось (вы получаете массив отсортирован в порядке убывания: [(4,) (3,) (2,) (1,) (0,)].
Обратите внимание, что start= and stop= - это позиции в индексе, а не номер строки. Смотрите этот вопрос и ответы для обсуждения:
Возможно ли обратный поиск позиции индекса для itersorted в 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])
...