Есть ли способ построить ленивые последовательности в Python? - PullRequest
2 голосов
/ 16 июня 2011

Существует представление Django, которое загружает Member объекты из базы данных с определенным фильтром.

Теперь мне нужно изменить эту логику на сначала представить конкретный Member, а остальные должны следовать в их естественном порядке .

Самый простой способ - сразу выполнить запрос, получить список, удалить и вставить элемент в начале. Однако мне очень любопытно , если есть еще способ использовать ленивый характер QuerySet .

В C # я бы написал:

IEnumerable<Member> members = db.Members; // db.Members is lazy
members = Enumerable.Union( // construct a lazy sequence that traverses its arguments
    new [] { specificMember },
    members.Where(m => m != specificMember)
);

Поскольку цикл проходит через members, он сначала получает specificMember, а затем использует независимо от оригинальной ленивой логики загрузки db.Members, используемой .

Есть ли способ сделать то же самое в Django и Python?

1 Ответ

6 голосов
/ 16 июня 2011

Используйте itertools.chain. Что-то вроде:

import itertools
original_members = .... # get an iterator of the data
members = itertools.chain([specific_member], original_members)

Функция цепочки возвращает итератор. Итератор начинает с возврата значения из последовательности в первом параметре, который представляет собой одноэлементный список, содержащий specific_member. Затем он начинает возвращать значения из original_members, что, как я полагаю, является ленивой последовательностью.

...