繁体   English   中英

如何以循环方式组合两个数组,以便在 python (django) 中出现一个列表的 3 个项目,然后出现另一个列表的 1 个项目

[英]How do I combine two arrays in for loop fashion so the 3 items of one list appear then 1 item of the other list appears, in python (django)

我正在构建一个包含事件和帖子的社交媒体网站,我希望用户提要每 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', 'p2', 'p3', 'e1', 'p4', 'p5', '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', 'e2', 'e3', 'e4']
posts = ['p1', 'p2', 'p3', 'p4', 'p5', 'p6']

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

组合 = ['p1', 'p2', 'p3', 'e1', 'p4', 'p5', 'p6', 'e2', 'e3', 'e4']

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

另一种方法是在视图函数中做。 那里的代码类似于模板所需的代码。 简单地遍历帖子,并检查索引是否准确地除以四,如果是,则将事件推入列表中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM