【问题标题】:Periodically slice an list/array定期对列表/数组进行切片
【发布时间】:2017-02-10 03:47:22
【问题描述】:

假设我有一个a = range(1,51)。我如何分割a 以创建一个如下所示的新列表:

[1,2,3,11,12,13,21,22,23,31,32,33,41,42,43]

有没有一种pythonic方法可以帮助我在不编写函数的情况下做到这一点?

我知道 [start:stop:step] 用于定期切片一个元素,但我不确定我是否遗漏了一些明显的东西。

编辑:建议的重复问题/答案与我的问题不同。我只是要求从更大的列表/数组中定期切片/提取元素。建议的副本修改现有数组的元素。

【问题讨论】:

标签: python numpy


【解决方案1】:

您可以使用 逻辑向量子集 的另一个选项,例如:

a[(a - 1) % 10 < 3]
# array([ 1,  2,  3, 11, 12, 13, 21, 22, 23, 31, 32, 33, 41, 42, 43])

(a - 1) % 10 找到数组的余数 10(句点);而(a - 1) % 10 &lt; 3 给出了一个逻辑向量,该向量对每十个元素的前三个元素都为真。

【讨论】:

  • 需要注意的是这仅适用于 numpy.array。 python 列表类型不适用于此。
  • @AlexFung 正确。 OP 标记了numpy,所以我假设它是 numpy 数组。
  • 注明。却是辉煌优雅……我怎么没想到呢? :0 :( :)
  • If numpy==True: choose(this_answer) score+=1
【解决方案2】:

你想要的比一个简单的切片更复杂,所以你需要某种(可能相当简单的)函数来完成它。我会考虑使用zip 组合多个切片,例如:

reduce(lambda a,b:a+b, map(list, zip(a[1::10], a[2::10], a[3::10])))

【讨论】:

    【解决方案3】:

    给定:

    >>> li=range(1,52)
    

    你可以这样做:

    >>> [l for sl in [li[i:i+3] for i in range(0,len(li),10)] for l in sl]
    [1, 2, 3, 11, 12, 13, 21, 22, 23, 31, 32, 33, 41, 42, 43, 51]
    

    或者,如果您只想要完整的子列表:

    >>> [l for sl in [li[i:i+3] for i in range(0,len(li),10)] for l in sl if len(sl)==3]
    [1, 2, 3, 11, 12, 13, 21, 22, 23, 31, 32, 33, 41, 42, 43]
    

    或者,给定:

    >>> li=range(1,51)
    

    那么你就不需要测试子列表了:

    >>> [l for sl in [li[i:i+3] for i in range(0,len(li),10)] for l in sl]
    [1, 2, 3, 11, 12, 13, 21, 22, 23, 31, 32, 33, 41, 42, 43]
    

    【讨论】:

      【解决方案4】:

      Psidom 的答案的索引数学也可以适应列表理解

      a = range(1,51)
      
      [n for n in a if (n - 1) % 10 < 3]
      
      Out[23]: [1, 2, 3, 11, 12, 13, 21, 22, 23, 31, 32, 33, 41, 42, 43]
      

      【讨论】:

        猜你喜欢
        • 2020-02-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-29
        • 2022-01-18
        • 1970-01-01
        • 2014-07-08
        • 2020-08-27
        相关资源
        最近更新 更多