我如何以循环方式组合两个数组,以便出现一个列表的3个项目,然后出现另一个列表的1个项目,使用pythondjango

问题描述

我正在建立一个包含事件和帖子的社交媒体网站,我希望用户Feed每4个帖子发布一次新的事件。因此,基本上,提要将如下所示:

帖子1,帖子2,帖子3,事件1,帖子4,帖子5,帖子6,事件2 ......

我是否在模板或视图中执行此操作?而我该怎么办呢?

解决方法

您认为可以执行以下操作:

def every_nth(iter1,iter2,n):
    count = 1
    while True:
        if count % n == 0:
            element_iter_2 = next(iter2,None)
            if element_iter_2: yield element_iter_2
        else:
            element_iter_1 = next(iter1,None)
            if element_iter_1: yield element_iter_1
        count += 1
        if not (element_iter_1 or element_iter_2):
            return

posts = ['p1','p2','p3','p4','p5','p6']  # Assuming you have iterables that contain posts
events = ['e1','e2','e3','e4']  # ... and events

iter_posts = iter(posts)
iter_events = iter(events)
combine = list(every_nth(iter_posts,iter_events,4))

# combine = ['p1','e1','p6','e2']

,

Yves Hary的基本思路,但要保证将显示所有项目:

from itertools import chain,zip_longest

# From python itertools cookbook: https://docs.python.org/3/library/itertools.html
def grouper(iterable,n,fillvalue=None):
    "Collect data into fixed-length chunks or blocks"
    # grouper('ABCDEFG',3,'x') --> ABC DEF Gxx"
    args = [iter(iterable)] * n
    return zip_longest(*args,fillvalue=fillvalue)

events = ['e1','e4']
posts = ['p1','p6']

combined = [
    *chain(
        *chain(
            *zip_longest(
                grouper(posts,3),grouper(events,1),fillvalue=[],)
        )
    )
]

combined = ['p1','e4']

,

如果要在模板中执行此操作,可以使用for计数器并在模板中添加过滤器。 This帖子应该有帮助

另一种方法是在视图函数中执行。那里的代码类似于模板所需的代码。只需遍历帖子,然后检查索引是否精确地除以四,如果是,则将事件推送到列表中。