Python: 根据输入从列表中获取元素

1 投票
2 回答
1066 浏览
提问于 2025-04-16 12:57

我知道这可能不是直接能做到的,所以我想了解一下你会怎么解决这个问题,尤其是针对一般情况。

我有一个列表,里面的内容像这样:[(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 时应该还是能奏效的。

撰写回答