python 2D列表的索引
数组和嵌套列表版本:
In [163]: A=np.arange(12).reshape(3,4)
In [164]: Al = A.tolist()
对于切片索引,列表解析(或映射当量)正常工作:
In [165]: A[:,1:3]
Out[165]:
array([[ 1, 2],
[ 5, 6],
[ 9, 10]])
In [166]: [l[1:3] for l in Al]
Out[166]: [[1, 2], [5, 6], [9, 10]]
对于高级索引,列表需要迭代的进一步级别:
In [167]: A[:,[0,2,3]]
Out[167]:
array([[ 0, 2, 3],
[ 4, 6, 7],
[ 8, 10, 11]])
In [169]: [[l[i] for i in [0,2,3]] for l in Al]
Out[169]: [[0, 2, 3], [4, 6, 7], [8, 10, 11]]
再次有各种映射选择。
In [171]: [operator.itemgetter(0,2,3)(l) for l in Al]
Out[171]: [(0, 2, 3), (4, 6, 7), (8, 10, 11)]
itemgetter
使用tuple(obj[i] for i in items)
产生的元组。
奇怪的是,itemgetter
返回的元组的列表索引,并列出了片:
In [176]: [operator.itemgetter(slice(1,3))(l) for l in Al]
Out[176]: [[1, 2], [5, 6], [9, 10]]
浪费,但应该工作:
list(zip(*(list(zip(*A))[0:9])))
稍微更经济的使用itertools.isclice
:
list(zip(*(itertools.islice(zip(*A), 0, 9))))
或者人们可以使用map
和operator.itemgetter
:
list(map(operator.itemgetter(slice(0,9)), A))
它似乎过度设计给我。只需一个简单的'[sub [0:9] for sub in A]'很好地工作:它是有效的和可读的。 –
@ juanpa.arrivillaga够公平的。 –
最后,我不确定效率在这里是否重要......如果OP想要高效的多维切片,他们应该使用numpy! –
Python列表真的没有像'numpy'阵列做的尺寸。真的没有“2D列表”。你必须自己编写逻辑,不过,使用切片和列表理解的组合应该相对简单。 –
坚持阵列。尽管表面相似,列表和阵列的工作方式却非常不同。 – user2357112