Получение граничных элементов из списка списков

#python #python-3.x #list

#python #python-3.x #Список

Вопрос:

Я ищу краткий способ получить список всех пограничных элементов (объяснение следует ниже) из списка списков без использования какого-либо внешнего пакета (например 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]
  

Код работает нормально, но мне интересно, есть ли более компактная форма? В частности, у меня такое ощущение, что два понимания списка (для получения первого и последнего элементов из 2-го и 2-го последних списков) могут быть объединены.

Комментарии:

1. что такое пограничные элементы?

2. Пожалуйста, объясните, что вы подразумеваете под пограничным элементом

3. Каков ожидаемый результат?

4. Как это [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?

Ответ №1:

Проверьте это немного более короткое решение

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

Комментарии:

1. Еще более компактный: a[0] a[-1] [x[i] for x in a[1:-1] for in (0,-1)] . Но указал мне правильное направление.

Ответ №2:

Попробуйте это 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]
  

Комментарии:

1. Я попросил более компактную форму. Ценю ваш ответ, но это не соответствует моим требованиям.

2. Вы хотите, чтобы он был короче?

3. Это то, о чем я прошу, да.

4. Почему бы вам не определить функцию и не добавить туда этот код? Затем вы можете вызвать эту функцию из кода ur. Ваш код выглядел бы намного чище.

5. Речь идет не о стиле кодирования, а о компактном способе выполнения.

Ответ №3:

Может быть, это вас удовлетворит :

 [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] 
  

Комментарии:

1. Я попросил более компактную форму. Ценю ваш ответ, но это не соответствует моим требованиям.