【问题标题】:Divide a Python list every n-element每个 n 元素划分一个 Python 列表
【发布时间】:2020-04-18 22:33:37
【问题描述】:

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

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)
    ]

谢谢!

【问题讨论】:

  • 你的问题不清楚。请提供代码以复制问题并在您的问题中更具体。你有什么不明白的?
  • @mm_ 我不明白变量 r 是如何工作的,以及列表中运算符 % 的内部工作是什么

标签: python list


【解决方案1】:

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

从外部循环开始,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的每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)]

【讨论】:

  • 谢谢,我同意。我认为还有更多“pythonic”:-)
【解决方案2】:

谁能帮我理解一下?

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

new_list = [element*2 for element in my_list]

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

但是,正如this post 所提到的,围绕列表理解、lambda、map、reduce 和 filter 进行了很多讨论。最终,由您决定什么最适合您的项目。除了列表推导,我不喜欢其他任何东西,所以我虔诚地使用它们。

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

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

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

【讨论】:

  • 我之前没有在这里问过,我没想到会有这么好的答案。非常感谢您的宝贵时间,我会继续研究它。
猜你喜欢
  • 2015-01-12
  • 2013-04-01
  • 2018-03-11
  • 2017-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-11
相关资源
最近更新 更多