Python: 根据输入从列表中获取元素
我知道这可能不是直接能做到的,所以我想了解一下你会怎么解决这个问题,尤其是针对一般情况。
我有一个列表,里面的内容像这样:[(array,time),(array,time)...]
,其中的array是一个numpy数组,可以有任意的n行m列。这个数组看起来像是array[[导数维度1],[导数维度2] ...]
。
我想从这个列表中写一个函数,生成两个列表,里面包含传入位置的所有值。这样的话就可以用来绘图了。
我能想到用其他数据结构来实现这个功能,但很遗憾这不是一个选项。
简单来说,我想要的是
def f(list, pos1, pos2):
xs = []
ys = []
for i in list:
ys.append(i pos1)
xs.append(i pos2)
return xs, ys
这里的i pos1
相当于i[n][m]
。真正的问题在于当数组是1行1列的时候,我不能仅仅传递整数。
如果能给点建议就太好了,抱歉帖子有点长,我想说得清楚一些。
谢谢!
2 个回答
0
如果我理解你的问题的话,像下面这样的做法应该既简单又快速,特别是当你需要多次执行这个操作的时候:
z = np.dstack([ arr for arr, time in lst ])
x, y = z[pos1], z[pos2]
举个例子:
In [42]: a = arange(9).reshape(3,3)
In [43]: z = np.dstack([a, a*2, a*3])
In [44]: z[0,0]
Out[44]: array([0, 0, 0])
In [45]: z[1,1]
Out[45]: array([ 4, 8, 12])
In [46]: z[0,1]
Out[46]: array([1, 2, 3])
1
如果我理解你的问题没错,你其实是想从一个列表的列表中选择一些索引,然后根据这些选择创建新的列表。
从一个列表的列表中选择索引其实很简单,特别是当你有固定数量的选择时:
parts = [(item[pos1], item[pos2]) for item in list]
根据这些选择创建新的列表也很简单,可以使用内置的 zip() 函数:
separated = zip(*parts)
在最后的函数中,如果用生成器表达式代替列表推导式,你还可以进一步减少内存的使用:
def f( list, pos1, pos2 ):
partsgen = ((item[pos1], item[pos2]) for item in list)
return zip(*partsgen)
下面是实际操作的样子:
>>> f( [['ignore', 'a', 1], ['ignore', 'b', 2],['ignore', 'c', 3]], 1, 2 )
[('a', 'b', 'c'), (1, 2, 3)]
更新:在重新阅读问题和评论后,我意识到这个解释有点过于简单。不过,整体思路在你用合适的索引替换 pos1 和 pos2 时应该还是能奏效的。