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

Python 从列表列表中获取边框元素,python,python-3.x,list,Python,Python 3.x,List,我正在寻找一种简洁的方法,从列表中获取所有边框元素的列表(解释如下),而不使用任何外部包(例如numpy) 定义:边界元素 边框元素可以是: 第一个或最后一个列表中的元素 列表的第一个或最后一个元素 例子 假设以下列表: a = [ [1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [13, 14, 15, 16] ] 预期产量 预期的输出是边界元素的列表,顺序并没有真正起作用。因此,以下是一个有效的结果: [1, 2

我正在寻找一种简洁的方法,从列表中获取所有边框元素的列表(解释如下),而不使用任何外部包(例如
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= [
    [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] 

看看这是一个略短的解决方案

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

什么是边界元素?请解释边界元素的含义预期的输出是什么?它是怎样的
[1,2,3,4,13,14,15,16,5,8,8,12]
?它不是应该是
[1,2,3,4,13,14,15,16,5,8,9,12]
?为什么会有两个8?我要求一个更紧凑的表格。感谢您的回答,但这不符合我的要求。您希望它更短吗?这就是我的要求,是的。为什么不定义一个函数并在那里添加此代码?然后你可以从你的代码中调用这个函数。你的代码看起来会更干净。这不是关于编码风格,而是关于一种紧凑的做事方式。我要求一个更紧凑的表单。感谢您的回答,但这不符合我的要求。更简洁的是:
a[0]+a[-1]+[x[i]代表x,而[1:-1]代表(0,-1)]
。但为我指明了正确的方向。