代码之家  ›  专栏  ›  技术社区  ›  yatu Sayali Sonawane

在列表中每隔n个项获取一块项

  •  3
  • yatu Sayali Sonawane  · 技术社区  · 6 年前

    假设我有以下清单:

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

    什么是最具蟒蛇式的切片方式 l 为了得到大块的长度 n 离开 k 块之间的项目?

    n=2 k=3

    [4,3,5,8,12,2]
    
    4 回复  |  直到 6 年前
        1
  •  5
  •   akuiper    6 年前

    使用列表理解:

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

    A. 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])
    
        2
  •  1
  •   Jakob    6 年前

    我的理解是列表理解,即使你需要使用两个,否则它只会产生一个列表。

    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
  •  0
  •   subjord    6 年前

    一个可能的解决办法是

    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)
    

        4
  •  0
  •   Sheldore    6 年前

    下面是一种使用切片的替代解决方案

    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] 从第一个元素开始每五个元素 l[1:][::5] 从第二个元素开始,每五个元素提供一次。然后将两者合并在一起