Python:根据输入从列表中获取项目

时间:2011-03-03 18:20:51

标签: python list numpy

我很欣赏这可能不是直接可能的,所以我会感兴趣你将如何解决这个问题的一般情况。 我有一个看起来像这样的列表项,[(array,time),(array,time)...]数组是一个numpy数组,可以有任意n×m维。这看起来像array[[derivatives dimension1],[derivatives dimension 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 :(得分: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交换为包含的数组中的适当索引时,一般的想法仍然有效。

答案 1 :(得分: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])