>如果我有几个(浮点数(的列表,例如
list = [
[111, 111, 4523.123, 111, 111],
[111, 111, 4526.15354, 111, 111],
[111, 111, 4580.112, 111, 111],
]
如何在不使用循环的情况下获得第三列?如果它是 matlab 中的矩阵,我会做list(:,3)
.
你当然可以使用Numpy来帮助你实现这一目标。
import numpy as np
list = np.array([
[111, 111, 4523.123, 111, 111],
[111, 111, 4526.15354, 111, 111],
[111, 111, 4580.112, 111, 111],
])
list[:,2]
我认为在不使用任何循环的情况下,您无法使用本机 python 列表来实现这一点。
使用 zip 将列转置为行,然后选择第三个子列表(行(
lst = [
[111, 111, 4523.123, 111, 111],
[111, 111, 4526.15354, 111, 111],
[111, 111, 4580.112, 111, 111],
]
第三列:
list(zip(*lst))[2]
使用库numpy
:
import numpy as np
list = [
[111, 111, 4523.123, 111, 111],
[111, 111, 4526.15354, 111, 111],
[111, 111, 4580.112, 111, 111],
]
np_list = np.array(list)
third_col = np_list[:,2] # counting starts from 0
Numpy 是一个非常好的解决方案:
import numpy as np
list = [
[111, 111, 4523.123, 111, 111],
[111, 111, 4526.15354, 111, 111],
[111, 111, 4580.112, 111, 111],
]
np_list = np.array(list)[:,2]
对于更复杂的数据操作,我建议使用pandas.DataFrame
(https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.html(
如果必须使用列表,可以尝试列表理解。从技术上讲,这是一个循环,但使用更短的语法,并且是一种非常pythonic的集合处理方式。它还使您无需使用外部库:
>>> list = [
... [111, 111, 4523.123, 111, 111],
... [111, 111, 4526.15354, 111, 111],
... [111, 111, 4580.112, 111, 111],
... ]
>>> l = [ x[2] for x in list ]
>>> l
[4523.123, 4526.15354, 4580.112]
没有,但你可以创建一个处理它的类。基本上你需要覆盖类的__getitem__
方法,检查传递的值是否是元组,在这种情况下相应地返回:
class MatlabList(list):
def __init__(self, *args):
if len(args) > 1:
return super().__init__(args)
return super().__init__(*args)
def __getitem__(self, item):
if isinstance(item, tuple):
# Remove the non-needed tuple in case it onle has one element
if len(item) == 1:
return self[item[0]]
if isinstance(item[0], slice):
return MatlabList(map(lambda x: x[item[1:]], self[item[0]]))
return self[item[0]][item[1:]]
return super().__getitem__(item)
lst = MatlabList(
MatlabList(111, 111, 4523.123, 111, 111),
MatlabList(111, 111, 4526.15354, 111, 111),
MatlabList(111, 111, 4580.112, 111, 111),
)
lst[1,2] # cell at 2nd row, 3rd column
lst[1,:] # 2nd row
lst[:,2] # 3rd column