【问题标题】:Is there a way to construct lazy sequences in Python?有没有办法在 Python 中构造惰性序列?
【发布时间】:2011-09-15 22:42:41
【问题描述】:

有一个 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 中做同样的事情?

【问题讨论】:

    标签: python django django-queryset lazy-sequences generator-expression


    【解决方案1】:

    使用itertools.chain。比如:

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

    chain 函数返回一个迭代器。迭代器首先从第一个参数中的序列返回值,这是一个包含 specific_member 的单元素列表。然后它开始从original_members 返回值,我认为这是一个惰性序列。

    【讨论】:

    • 这太棒了。正是我要找的东西,但不知道名字。谢谢。
    猜你喜欢
    • 2015-10-11
    • 1970-01-01
    • 2011-09-14
    • 1970-01-01
    • 1970-01-01
    • 2014-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多