如何使用python对索引中的每个第n个元素进行切片?

时间:2017-08-24 04:32:07

标签: python list

这可能看起来像一个简单的问题,但我无法找到解决方案。

假设我有这个清单

my_list = [1,2,3,4,5,6,7,8,9,11,22,33,44,55,66,77,88,99]

我正在尝试将此列表中的项目切片并按索引递增。简而言之,我想得到像这样的结果

[1, 2, 3]
[2, 3, 4]
[3, 4, 5]
[4, 5, 6]
[5, 6, 7]
[6, 7, 8]
[7, 8, 9]
[8, 9, 11]
[9, 11, 22]
[11, 22, 33]
[22, 33, 44]
[33, 44, 55]
[44, 55, 66]
[55, 66, 77]
[66, 77, 88]
[77, 88, 99]

但我得到的是这样的

[1, 2, 3]
[2, 3, 4]
[3, 4, 5]
[4, 5, 6]
[5, 6, 7]
[6, 7, 8]
[7, 8, 9]
[8, 9, 11]
[9, 11, 22]
[11, 22, 33]
[22, 33, 44]
[33, 44, 55]
[44, 55, 66]
[55, 66, 77]
[66, 77, 88]
[77, 88, 99]
[88, 99]
[99]

我想将my_list切片到几个长度为3的较小的集合。但是我得到的结果还包括长度小于3的列表。

这是我使用的python脚本

my_list = [1,2,3,4,5,6,7,8,9,11,22,33,44,55,66,77,88,99]

m = 0

def incr():
    global m
    for n in range(len(my_list)):
        if n < len(my_list):
            n = m + 3
            new_list = my_list[m:n]
            print new_list
            m+=1
        else:
            pass

incr()

我认为我可以添加if len(new_list) < 3,但我不确定应该如何修改脚本。

感谢您的帮助。

4 个答案:

答案 0 :(得分:2)

[my_list[i:i+3] for i in range(len(my_list)-2)]

小解释:

  • 我使用了List Comprehensions

  • 结果列表包含的项目数为len(my_list)-2)

  • 构建每个结果项目,从原始列表[i:i+3]

  • 切割三个连续项目
  • i从0开始获取结果列表的第一项,然后移动一个位置(递增1)以获得第二项,依此类推......

答案 1 :(得分:2)

您希望以重叠的方式迭代块。 这是一个常见的要求,在许多应用程序中称为滚动窗口。您可以使用itertools中的tee

>>> def thinger(iterable, n=3):
...     iterators = tee(iterable, n)
...     for i, iterator in enumerate(iterators):
...         for skip in range(i):
...             next(iterator, None)
...     return zip(*iterators)
... 
>>> list(thinger([1,2,3,4,5,6]))
[(1, 2, 3), (2, 3, 4), (3, 4, 5), (4, 5, 6)]
>>> list(thinger([1,2,3,4,5,6], n=4))
[(1, 2, 3, 4), (2, 3, 4, 5), (3, 4, 5, 6)]

zip实际上返回了元组,如果你是鸭子类型,这可能没问题,但你可以在必要时将它们转换为列表:

>>> [list(x) for x in thinger([1,2,3], n=2)]
[[1, 2], [2, 3]]

答案 2 :(得分:1)

my_list = [1,2,3,4,5,6,7,8,9,11,22,33,44,55,66,77,88,99]

def temp(lst,no):
    result = []
    for i in range(len(lst)-no+1):
        result.append(lst[i:i+no])
    return result

print temp(my_list,3)    
print temp(my_list,4)

<强>输出

[[1, 2, 3], [2, 3, 4], [3, 4, 5], [4, 5, 6], [5, 6, 7], [6, 7, 8], [7, 8, 9], [8, 9, 11], [9, 11, 22], [11, 22, 33], [22, 33, 44], [33, 44, 55], [44, 55, 66], [55, 66, 77], [66, 77, 88], [77, 88, 99]]                                        

[[1, 2, 3, 4], [2, 3, 4, 5], [3, 4, 5, 6], [4, 5, 6, 7], [5, 6, 7, 8], [6, 7, 8, 9], [7, 8, 9, 11], [8, 9, 11, 22], [9, 11, 22, 33], [11, 22, 33, 44], [22, 33, 44, 55], [33, 44, 55, 66], [44, 55, 66, 77], [55, 66, 77, 88], [66, 77, 88, 99]]

答案 3 :(得分:0)

像这样:

my_list = [1,2,3,4,5,6,7,8,9,11,22,33,44,55,66,77,88,99]

m = 0

def incr():
    global m
    for n in range(len(my_list)):
        if n+3 <= len(my_list):
            n = m + 3
            new_list = my_list[m:n]
            print new_list
            m +=1  
        else:
            pass

incr()