我正在寻找一种简洁的方法,在不使用任何外部包(例如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]