【问题标题】:get a chunk of items every n items in list获取列表中每 n 个项目的一大块项目
【发布时间】:2018-12-20 18:02:31
【问题描述】:

假设我有以下列表:

l = [4,3,1,5,3,5,8,11,10,4,12,2,1]

为了得到长度为 n 的块而在块之间留下 k 的项目,最 Pythonic 的方法是什么?

例如,如果n=2k=3 结果应该是:

[4,3,5,8,12,2]

【问题讨论】:

  • 你的意思是对列表 l 进行切片的最 Pythonic 方式是什么,以便它为列表 l 中的每个 n 返回一个长度为 k 的块?您能否详细说明您是如何获得结果的?
  • 我认为一个长度为n的块,从列表中跳过一个长度为k的块,l就是你想要的。

标签: python arrays list numpy


【解决方案1】:

使用列表推导:

[e for i in range(0, len(l), n+k) for e in l[i:i+n]]
# [4, 3, 5, 8, 12, 2]

numpy 的解决方案是:

import numpy as np

idx = (np.arange(0, len(l), n+k)[:,None] + np.arange(n)).ravel()
np.array(l)[idx]
# array([ 4,  3,  5,  8, 12,  2])

【讨论】:

  • 我认为使用生成器可能是最好的方法。请注意,它也可以在不使用 numpy 的情况下完成。
  • 如果一个生成器已经有一个生成器,那就太好了,但是 OP 有一个列表可以开始,如果一个生成器适合这里,我不是。是的,第一个列表理解解决方案是在没有 numpy 的情况下完成的。
【解决方案2】:

我的看法是列表推导,即使您需要使用两个,否则它只会生成列表列表。

l = [4,3,1,5,3,5,8,11,10,4,12,2,1]
n = 2
k = 3

chunk_l = [y for x in [l[i:i+n] for i in range(0,len(l), n+k)] for y in x]
print(chunk_l)
#[4, 3, 5, 8, 12, 2]

【讨论】:

    【解决方案3】:

    一个可能的解决方案是

    l = [4,3,1,5,3,5,8,11,10,4,12]
    k,n=3,2
    res=[]
    while l:
        res+=l[:n]
        l=l[n+k:]
    print(res)
    

    这可能会在 pythonicizity 方面进行大量优化。

    【讨论】:

      【解决方案4】:

      以下是使用切片的另一种解决方案

      l = np.array([4,3,1,5,3,5,8,11,10,4,12,2,1])
      A = l[:][::5]
      B = l[1:][::5] 
      final = np.insert(B, np.arange(len(A)), A)
      # array([ 4,  3,  5,  8, 12,  2])
      

      l[:][::5] 提供从第一个元素开始的每 5 个元素,l[1:][::5] 提供从第二个元素开始的每 5 个元素。然后将两者合并在一起

      【讨论】:

        猜你喜欢
        • 2015-09-22
        • 2016-08-12
        • 2021-12-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-11-07
        • 1970-01-01
        相关资源
        最近更新 更多