从索引列表创建子列表的 Pythonic 方法
Pythonic way to create sublists from a list of indices
我想知道一种以这种方式从具有索引的列表创建较小列表的优雅方法:
我的名单:
lst= [ 0, 1, 5, 0, 3, 7, 1, 3, 9, 1, 0]
我的索引:
index_list=[2, 5 ,8]
我通过查找峰值获得索引,现在我希望它在这些峰值之间创建子列表。
所以我预计 return:
returned_list = [[0,1,5], [0,3,7], [1,3,9], [1, 0]]
我正在尝试这样的事情:
def 子列表(lst,索引):
tmplst = []
list_of_list = []
for j in range(len(index)):
for i in range(len(lst)):
if index[j] > lst[i]:
tmplst.append(lst[i])
请让我知道我能做什么。
让我们尝试 zip
列表理解:
[a[x+1:y+1] for x,y in zip([-1] + index_list, index_list + [len(a)])]
输出:
[[0, 1, 5], [0, 3, 7], [1, 3, 9], [1, 0]]
您在 index_list
中使用的索引一开始并不是很 pythonic,因为它们不符合 python 中切片所采用的索引约定。
所以让我们从更正这个开始:
index_list = [index + 1 for index in index_list]
完成后,我们可以使用 slice
来获取必要的切片。 None
用于表示列表的开始或结束。
[lst[slice(start, end)] for start, end in zip([None] + index_list,
index_list + [None])]
当您用 numpy
标记您的问题时,可能的答案是:
import numpy as np
lst = [ 0, 1, 5, 0, 3, 7, 1, 3, 9, 1, 0]
index_list = [2, 5 ,8]
index_list = [i+1 for i in index_list] # in python indices are starting with 0
arrays_list = np.split(lst, index_list)
returned_list = list(map(list,arrays_list))
print(returned_list)
输出:
[[0, 1, 5], [0, 3, 7], [1, 3, 9], [1, 0]]
不确定是否是 pythonic,但是numpy
有一个内置函数
import numpy as np
lst = [0, 1, 5, 0, 3, 7, 1, 3, 9, 1, 0]
index_list = [el + 1 for el in [2, 5, 8]]
resp = np.split(lst, index_list, axis=0)
print(resp)
lst= [ 0, 1, 5, 0, 3, 7, 1, 3, 9, 1, 0]
index_list=[2, 5 ,8,11]
index_lst2 = [slice(x -2, x +1) for x in index_list]
returned_list = [lst[index] for index in index_lst2]
print(returned_list)
我想知道一种以这种方式从具有索引的列表创建较小列表的优雅方法:
我的名单:
lst= [ 0, 1, 5, 0, 3, 7, 1, 3, 9, 1, 0]
我的索引:
index_list=[2, 5 ,8]
我通过查找峰值获得索引,现在我希望它在这些峰值之间创建子列表。
所以我预计 return:
returned_list = [[0,1,5], [0,3,7], [1,3,9], [1, 0]]
我正在尝试这样的事情:
def 子列表(lst,索引):
tmplst = []
list_of_list = []
for j in range(len(index)):
for i in range(len(lst)):
if index[j] > lst[i]:
tmplst.append(lst[i])
请让我知道我能做什么。
让我们尝试 zip
列表理解:
[a[x+1:y+1] for x,y in zip([-1] + index_list, index_list + [len(a)])]
输出:
[[0, 1, 5], [0, 3, 7], [1, 3, 9], [1, 0]]
您在 index_list
中使用的索引一开始并不是很 pythonic,因为它们不符合 python 中切片所采用的索引约定。
所以让我们从更正这个开始:
index_list = [index + 1 for index in index_list]
完成后,我们可以使用 slice
来获取必要的切片。 None
用于表示列表的开始或结束。
[lst[slice(start, end)] for start, end in zip([None] + index_list,
index_list + [None])]
当您用 numpy
标记您的问题时,可能的答案是:
import numpy as np
lst = [ 0, 1, 5, 0, 3, 7, 1, 3, 9, 1, 0]
index_list = [2, 5 ,8]
index_list = [i+1 for i in index_list] # in python indices are starting with 0
arrays_list = np.split(lst, index_list)
returned_list = list(map(list,arrays_list))
print(returned_list)
输出:
[[0, 1, 5], [0, 3, 7], [1, 3, 9], [1, 0]]
不确定是否是 pythonic,但是numpy
有一个内置函数
import numpy as np
lst = [0, 1, 5, 0, 3, 7, 1, 3, 9, 1, 0]
index_list = [el + 1 for el in [2, 5, 8]]
resp = np.split(lst, index_list, axis=0)
print(resp)
lst= [ 0, 1, 5, 0, 3, 7, 1, 3, 9, 1, 0]
index_list=[2, 5 ,8,11]
index_lst2 = [slice(x -2, x +1) for x in index_list]
returned_list = [lst[index] for index in index_lst2]
print(returned_list)