#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. Я попросил более компактную форму. Ценю ваш ответ, но это не соответствует моим требованиям.