繁体   English   中英

每个 n 元素划分一个 Python 列表

[英]Divide a Python list every n-element

最近,我发现了一个从列表中开发一组列表的代码,该代码是由用户Mai编写的,回答问题但我还没有理解它。 有人可以帮我理解吗? 而且...有没有办法更容易地重写该代码? 代码是:

def even_divide(lst, num_piece=4):
    return [
        [lst[i] for i in range(len(lst)) if (i % num_piece) == r]
        for r in range(num_piece)
    ]

谢谢!

其实很简单。 只需遵循两个循环的值:

从外部循环开始, r将是0 ,然后是1 ,然后是2 ,等等。让我们看看r == 1的情况。 当运行i的不同值时(即0, 1, 2, ... len(lst)i % 4的值,即i除以4的余数将为0, 1, 2, 3, 0, 1, 2, 3, ...因此,对于 i 的每 4 个值, i i % 4等于r

对于我们选择的r == 1 ,这意味着我们选择lst[1], lst[5], lst[9], ...等。

对于r == 2 你猜对了! 你会拿起lst[2], lst[6], lst[10],...

所以总的来说,你会得到 4 个列表,其中原始列表的元素不重叠,每次只需“跳跃”4 个元素,但从不同的值开始。

这自然会导致更简单的解决方案:

def even_divide(lst, num_piece=4):
    return [lst[r::num_piece] for r in range(num_piece)]

有人可以帮我理解吗?

当然。 这是一个列表理解。 列表推导接受一个列表并对列表中的每个元素执行某些操作:假设我想将列表中的每个元素乘以 2:

new_list = [element*2 for element in my_list]

使它成为列表理解的是括号语法。 对于那些不熟悉它的人来说,这通常是需要一点时间来适应的部分。 话虽如此,我认为这就是让您难以理解问题中的代码的原因,因为您在列表理解中具有列表理解。 现在可能很难理解,但列表推导在 python 中是一件很棒的事情。

但是,正如这篇文章所提到的,有很多关于列表理解、lambda、map、reduce 和 filter 的讨论。 最终,由您决定什么最适合您的项目。 除了列表推导之外,我不喜欢其他任何东西,所以我虔诚地使用它们。

根据您链接的问题,列表理解采用长度 x 的一维列表并将其转换为(长度 x,宽度 y)的二维列表。 这就像numpy.reshape

而且...有没有办法重写该代码[以]更容易?

我不会推荐它。 列表推导被认为是非常 Python 的,你会在任何地方看到它们。 最好使用它们并习惯它们。

暂无
暂无

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

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