从列表列表中获取边框元素



我正在寻找一种简洁的方法,在不使用任何外部包(例如numpy(的情况下,从列表列表中获取所有边界元素的列表(解释如下(。

定义:边界元素

边界元素是:

  • 第一个或最后一个列表中的元素
  • 列表的第一个或最后一个元素

示例

假设以下列表:

a = [
[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12],
[13, 14, 15, 16]
]

预期输出

预期的输出是一个边界元素列表,顺序并没有真正发挥作用。所以以下是一个有效的结果:

[1, 2, 3, 4, 13, 14, 15, 16, 5, 9, 8, 12]

当前方法

目前我正在做以下工作:

border = a[0] + a[-1] + [x[0] for x in a[1:-1]] + [x[-1] for x in a[1:-1]
# [1, 2, 3, 4, 13, 14, 15, 16, 5, 9, 8, 12]

代码运行良好,但我想知道是否有更紧凑的形式?特别是,我有一种感觉,这两种列表理解(从倒数第二个列表中获得第一个和最后一个元素(可以组合在一起。

看看这个稍微短一点的解决方案

a[0] + a[-1] + [y for x in a[1:-1] for y in [x[0],x[-1]]]

尝试此list comprehension:

a= [
[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12],
[13, 14, 15, 16]
]
border = [item for sublist in [lst if i == 0 or i == len(a)-1 else [lst[0],lst[-1]] for i, lst in enumerate(a)] for item in sublist]

输出:

>>> border
[1, 2, 3, 4, 5, 8, 9, 12, 13, 14, 15, 16]

也许这会让你满意:

[item for sublist in [[i[0], i[-1]] for i in a] + [i[1:-1] for i in [a[0], a[-1]]] for item in sublist] 

最新更新