在Python中如何构建懒序列?

2 投票
1 回答
1272 浏览
提问于 2025-04-16 19:39

有一个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

使用 itertools.chain。可以这样做:

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

这个链式函数会返回一个迭代器。这个迭代器首先会返回第一个参数中的值,也就是一个只包含特定成员的单元素列表。接着,它会开始返回 original_members 中的值,我猜这个是一个延迟加载的序列。

撰写回答