所以我有一个名为 someList 的简短列表,里面有一些数字。我想要做的是输出列表中的每3个元素,同时每隔3个切片范围迭代它。
所以,如果我有
someList = [1,2,3,4,5,6,7,8,9,10]
我的 someList 的输出应该是这样的
[[1, 2, 3], [2, 3, 4], [3, 4, 5], [4, 5, 6], [5, 6, 7], [6, 7, 8], [7, 8, 9], [8, 9, 10]]
这是我的代码,我已经定义了一个新的 temp 列表来存储输出值
someList = [1,2,3,4,5,6,7,8,9,10]
lookupRange = 3
temp = []
for index,i in enumerate(someList):
while index <= len(someList):
temp.append(someList[index:index+lookupRange])
index += 1
print(temp)
然而,在运行此代码时,我得到了一些意想不到的结果......
[[1, 2, 3], [2, 3, 4], [3, 4, 5], [4, 5, 6], [5, 6, 7], [6, 7, 8], [7, 8, 9], [8, 9, 10], [9, 10], [10], [], [2, 3, 4, 5, 6, 7, 8, 9, 10], [3, 4, 5, 6, 7, 8, 9, 10], [4, 5, 6, 7, 8, 9, 10], [5, 6, 7, 8, 9, 10], [6, 7, 8, 9, 10], [7, 8, 9, 10], [8, 9, 10], [9, 10], [10], [], [3, 4, 5, 6, 7, 8, 9, 10], [4, 5, 6, 7, 8, 9, 10], [5, 6, 7, 8, 9, 10], [6, 7, 8, 9, 10], [7, 8, 9, 10], [8, 9, 10], [9, 10], [10], [], [4, 5, 6, 7, 8, 9, 10], [5, 6, 7, 8, 9, 10], [6, 7, 8, 9, 10], [7, 8, 9, 10], [8, 9, 10], [9, 10], [10], [], [5, 6, 7, 8, 9, 10], [6, 7, 8, 9, 10], [7, 8, 9, 10], [8, 9, 10], [9, 10], [10], [], [6, 7, 8, 9, 10], [7, 8, 9, 10], [8, 9, 10], [9, 10], [10], [], [7, 8, 9, 10], [8, 9, 10], [9, 10], [10], [], [8, 9, 10], [9, 10], [10], [], [9, 10], [10], [], [10], []]
正如你所看到的,对于前几行,我确实得到了切片范围为3的所需输出。但在那之后它只是疯了......
关于这里出错的任何想法?
PS:我知道有一种简单的方法可以做到这一点(例如numpy.convolve函数),但是这个问题特别要求我只用for和while循环来做。答案 0 :(得分:4)
你有嵌套循环,但你只需要一个循环。
someList = [1,2,3,4,5,6,7,8,9,10]
lookupRange = 3
temp = []
for index in range(len(someList) - lookupRange + 1):
temp.append(someList[index:index+lookupRange])
答案 1 :(得分:2)
这是一个纯Python的单线程; Numpy不是必需的。
someList = [1,2,3,4,5,6,7,8,9,10]
lookupRange = 3
temp = list(zip(*(someList[i:] for i in range(lookupRange))))
print(temp)
<强>输出强>
[(1, 2, 3), (2, 3, 4), (3, 4, 5), (4, 5, 6), (5, 6, 7), (6, 7, 8), (7, 8, 9), (8, 9, 10)]
在Python 2中,temp
的分配可以简化为
temp = zip(*(someList[i:] for i in range(lookupRange)))
如果确实需要列表而不是元组列表,则可以将其更改为
temp = [list(u) for u in zip(*(someList[i:] for i in range(lookupRange)))]
在Python 2或3中同样有效。
但我坚持使用元组(除非你需要改变那些内部列表):元组使用较少的RAM,使用元组的代码通常比基于列表的等效代码快。
这是最后一个版本使用了几个传统的for
循环,而不是嵌套在列表推导中的生成器表达式。
someList = [1,2,3,4,5,6,7,8,9,10]
lookupRange = 3
offset_lists = []
for i in range(lookupRange):
offset_lists.append(someList[i:])
temp = []
for u in zip(*offset_lists):
temp.append(list(u))
print(temp)
<强>输出强>
[[1, 2, 3], [2, 3, 4], [3, 4, 5], [4, 5, 6], [5, 6, 7], [6, 7, 8], [7, 8, 9], [8, 9, 10]]
答案 2 :(得分:1)
使用列表理解:
>>> someList = [1,2,3,4,5,6,7,8,9,10]
>>> chunk = 3
>>> [someList[i : i + chunk] for i in range(len(someList) - chunk + 1)]
[[1, 2, 3], [2, 3, 4], [3, 4, 5], [4, 5, 6], [5, 6, 7], [6, 7, 8], [7, 8, 9], [8, 9, 10]]