输出具有列表推导的嵌套列表

时间:2016-03-24 17:52:18

标签: python list list-comprehension

我有以下列表:

 a = [[0,11], [1,12], [3,14], [5,16],[7,18]]

我想创建一个新列表b,其中包含所有元素

 a[:,0] > 3

并在所选嵌套列表的a中添加索引。 所以b shoudl看起来像:

b = [[3, 5, 16],[4, 7,18]]

使用:

b = [points, points in a if points[0]>3]

将输出b = [[5, 16],[7,18]]索引和

b = [[index, points], index, points in enumerate(a) if points[0]>3]

显示错误。如何使用列表理解生成b

3 个答案:

答案 0 :(得分:3)

您可以使用一次性变量元组来保存嵌套列表项:

>>> [[i,j,k] for i,(j,k) in enumerate(a) if j>3]
[[3, 5, 16], [4, 7, 18]]

或者,对于包含更多项目的列表的更全面的方法,您可以在列表理解之后使用:

>>> [[i] + points for i, points in enumerate(a) if points[0]>3]
[[3, 5, 16], [4, 7, 18]]

使用解包赋值的Python 3版本:

>>> [[i, first] + rest for i,(first, *rest) in enumerate(a) if first>3]
[[3, 5, 16], [4, 7, 18]]

答案 1 :(得分:1)

如果a是NumPy数组(它似乎在您的实际用例中),您可以执行以下操作:

# One of the rare cases when numpy.where isn't superfluous.
indices = numpy.where(a[:, 0] > 3)[0]

index_column = indices[:, None]
selected_rows = a[indices]

b = numpy.hstack([index_column, selected_rows])

或者使用较少的中间变量:

indices = numpy.where(a[:, 0] > 3)[0]
b = numpy.hstack([indices[:, None], a[indices]])

对于大型a,这可能会优于基于enumerate或其他Python级迭代技术的解决方案。

答案 2 :(得分:0)

好吧,我开始回答这个问题但其他人在我可以之前发布了,所以这是另一种方式(没有列表理解,但仍然非常神秘):

map(lambda y: [y[0]] + y[1], filter(lambda x: x[1][0] > 3, enumerate(a)))