Я новичок в питоне, пытаюсь добиться следующего:
У меня есть список списков:
lst = [[567,345,234],[253,465,756, 2345],[333,777,111, 555]]
Я хочу отобразить lst в другой список, содержащий только второе наименьшее число из каждого подсписка. Итак, результат должен быть:
[345, 465, 333]
Например, если бы меня интересовало наименьшее число, я мог бы сделать:
map(lambda x: min(x),lst)
Хотел бы я сделать это:
map(lambda x: sort(x)[1],lst)
но сортировка не связывает. (не возвращает None)
и что-то подобное не допускается:
map(lambda x: sort(x); x[1],lst) #hence the multiple statement question
Есть ли способ сделать это с помощью карты в Python, но без определения именованной функции ? (это просто с анонимными блоками в рубине, например)
lambda x: sort(x) OR x[1]
будет работать: здесь OR оценивает свой первый аргумент (возвращаемое значение None) как логическое значение (=> False), и в этом случае OR возвращает свой второй аргумент. Но, как говорится в ответах, лучше избегать лямбды.Ответы:
Здесь я могу дать несколько разных ответов, от вашего конкретного вопроса до более общих проблем. Итак, от наиболее конкретного к наиболее общему:
В. Можете ли вы поместить несколько операторов в лямбду?
A. Нет. Но на самом деле вам не нужно использовать лямбду.
def
Вместо этого вы можете поместить утверждения в . то есть:В. Можно ли получить второй самый низкий элемент из лямбда, отсортировав список?
А. Да. Как указывает ответ alex ,
sorted()
это версия сортировки, которая создает новый список, а не сортирует на месте, и может быть объединена в цепочку. Обратите внимание, что, вероятно, вам следует использовать именно это - плохая практика для вашей карты иметь побочные эффекты в исходном списке.В. Как мне получить второй самый низкий элемент из каждого списка в последовательности списков?
А. на
sorted(l)[1]
самом деле не лучший способ для этого. Он имеет сложность O (N log (N)), а решение O (n) существует. Его можно найти в модуле heapq.Так что просто используйте:
Также обычно считается более понятным использовать понимание списка, которое полностью избегает лямбда:
источник
k
(как здесь со «вторым по величине»)O(k*log(n)+n)
упрощается доO(n)
Помещение операторов в список может имитировать несколько операторов:
Например:
источник
None
.Путешественник во времени здесь. Если вы обычно хотите иметь несколько операторов в лямбде, вы можете передавать другие лямбды в качестве аргументов этой лямбда.
На самом деле у вас не может быть нескольких операторов, но вы можете смоделировать это, передав лямбды в лямбды.
Изменить: путешественник во времени возвращается! Вы также можете злоупотреблять поведением логических выражений (имея в виду правила сокращения и истинность), чтобы связать операции. Использование тернарного оператора дает вам еще больше возможностей. Опять же, у вас не может быть нескольких операторов , но вы, конечно, можете иметь много вызовов функций. В этом примере выполняется произвольный мусор с кучей данных, но он показывает, что вы можете делать некоторые забавные вещи. Операторы print являются примерами функций, которые возвращают
None
(как и.sort()
метод), но они также помогают показать, чтоlambda
делает.источник
Используйте функцию сортировки , например:
источник
[sorted(x)[1] for x in list_of_lists]
.Фактически, вы можете иметь несколько операторов в лямбда-выражении в Python. Это не совсем тривиально, но в вашем примере работает следующее:
Вы должны убедиться, что каждый оператор ничего не возвращает и не оборачивает его в (.. и False). Результат - это то, что вернула последняя оценка.
Пример:
источник
Используя begin () отсюда: http://www.reddit.com/r/Python/comments/hms4z/ask_pyreddit_if_you_were_making_your_own/c1wycci
источник
Хакерский способ объединить несколько операторов в один в Python - использовать ключевое слово «and» в качестве оператора короткого замыкания. Затем вы можете использовать этот единственный оператор непосредственно как часть лямбда-выражения.
Это похоже на использование «&&» в качестве оператора короткого замыкания в языках оболочки, таких как bash.
Также обратите внимание: вы всегда можете исправить оператор функции, чтобы он возвращал истинное значение, заключив функцию в оболочку.
Пример:
Если подумать, вероятно, лучше использовать «или» вместо «и», поскольку многие функции возвращают «0» или «Нет» в случае успеха. Затем вы можете избавиться от функции-оболочки в приведенном выше примере:
Операция 'and' будет оценивать выражения, пока не достигнет первого нулевого возвращаемого значения. после чего происходит короткое замыкание. 1 и 1 и 0 и 1 оценивают: 1 и 1 и 0, и отбрасывают 1
Операция 'или' будет оценивать выражения до тех пор, пока не дойдет до первого ненулевого возвращаемого значения. после чего происходит короткое замыкание.
0 или 0 или 1 или 0 оценивает 0, или 0, или 1, и отбрасывает 0
источник
Или, если вы хотите избежать лямбды и использовать генератор вместо списка:
(отсортировано (столбец) [1] для столбца в lst)
источник
Позвольте представить вам великолепный, но устрашающий взлом:
Теперь вы можете использовать эту
LET
форму как таковую:который дает:
[345, 465, 333]
источник
Вы можете сделать это за O (n) раз, используя min и index вместо использования sort или heapq.
Сначала создайте новый список всего, кроме минимального значения исходного списка:
Затем возьмите минимальное значение нового списка:
Теперь все вместе в одной лямбде:
Да, это действительно некрасиво, но алгоритмически дешево. Также, поскольку некоторые люди в этом потоке хотят видеть понимание списка:
источник
Именно для этого и используется
bind
функция в монаде .С помощью
bind
функции вы можете объединить несколько лямбд в одну лямбду, каждая из которых представляет собой оператор.источник
На самом деле есть способ использовать несколько операторов в лямбде. Вот мое решение:
источник
exec
не может быть исследован интеллектуальной IDEДа. Вы можете определить это таким образом, а затем заключить несколько выражений следующим образом:
Схема начала:
begin = lambda * x: x [-1]
Общий проект Lisp:
progn = лямбда * x: x [-1]
источник
Есть лучшие решения без использования лямбда-функции. Но если мы действительно хотим использовать лямбда-функцию, вот общее решение для работы с несколькими операторами: map (lambda x: x [1] if (x.sort ()) else x [1], lst)
Вам все равно, что возвращает оператор.
источник
Да, это возможно. Попробуйте ниже фрагмент кода.
источник
Я дам вам другое решение: заставьте лямбда-выражение вызывать функцию.
источник
junky = multiple_statements
.