是否有pythonic(请不要笨拙!)从列表列表中选择列表的子集列表?在MATLAB中,我试图模仿的行为可以用A(2:7, 5:8)
之类的例子来举例说明。
这不是一个家庭作业问题,只是寻找一个干净的解决方案。
这是一个具体的例子:
A = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
select(A, (1, 3), (0, 3))
应该产生
[[2, 3], [5, 6], [8, 9]]
答案 0 :(得分:4)
您可以将参数传递给切片:
def select(lst, subselect, select):
return [sublst[slice(*subselect)] for sublst in lst[slice(*select)]]
演示:
>>> def select(lst, subselect, select):
... return [sublst[slice(*subselect)] for sublst in lst[slice(*select)]]
...
>>> A = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
>>> select(A, (1, 3), (0, 3))
[[2, 3], [5, 6], [8, 9]]
您甚至可以使用None
来指示切片的默认值(0
start
和stop
参数的输入列表长度)或传入只需一个参数来指定stop
参数:
>>> select(A, (1, None), (3,))
[[2, 3], [5, 6], [8, 9]]
和第三个参数为您提供了指定步幅的选项。如果步幅为负,则列表颠倒:
>>> select(A, (1, None), (None, 3, 2))
[[2, 3], [8, 9]]
>>> select(A, (1, None), (None, None, -1))
[[8, 9], [5, 6], [2, 3]]
答案 1 :(得分:0)
select(A, (1, 3), (0, 3))
可以实现为[x[1:3] for x in A[0:3]]
>>> A = [1, 2, 3],[4, 5, 6],[7, 8, 9]
>>> [x[1:3] for x in A[0:3]]
[[2, 3], [5, 6], [8, 9]]
>>>