python从列表列表中选择范围

时间:2013-12-28 20:40:55

标签: python list

是否有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]]

2 个答案:

答案 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 startstop参数的输入列表长度)或传入只需一个参数来指定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]]
>>>