фильтрация элементов из списка списков в Python?

Я хочу фильтровать элементы из списка списков и перебирать элементы каждого элемента с помощью лямбда. Например, учитывая список:

a = [[1,2,3],[4,5,6]] 

предположим, что я хочу сохранить только элементы, где сумма списка больше N. Я пробовал писать:

 filter(lambda x, y, z: x + y + z >= N, a) 

но я получаю ошибку:

  <lambda>() takes exactly 3 arguments (1 given) 

Как я могу выполнять итерацию при присвоении значений каждого элемента x, y и z? Что-то вроде zip, но для сколь угодно длинного списка.

благодаря,

ps Я знаю, что могу написать это с помощью: filter (lambda x: sum (x) …, a), но это не так, представьте, что это не числа, а произвольные элементы, и я хотел присвоить их значения именам переменных.

7 Solutions collect form web for “фильтрация элементов из списка списков в Python?”

Использование lambda с filter – это глупость, когда у нас есть другие доступные методы.

В этом случае я, вероятно, разрешу конкретную проблему таким образом (или используя эквивалентное выражение генератора)

 >>> a = [[1, 2, 3], [4, 5, 6]] >>> [item for item in a if sum(item) > 10] [[4, 5, 6]] 

или, если мне нужно распаковать,

 >>> [(x, y, z) for x, y, z in a if (x + y) ** z > 30] [(4, 5, 6)] 

Если бы мне действительно нужна была функция, я мог бы использовать распаковку аргументов tuple (которая, кстати, удалена в Python 3.x, поскольку люди ее не используют): lambda (x, y, z): x + y + z берет кортеж и распаковывает три элемента в виде x , y и z . (Обратите внимание, что вы также можете использовать это в def , то есть: def f((x, y, z)): return x + y + z .)

Конечно, вы можете использовать распаковку стиля назначения ( def f(item): x, y, z = item; return x + y + z ) и индексирование ( lambda item: item[0] + item[1] + item[2] ) во всех версиях Python.

Вы можете явно называть элементы подсписок (при условии, что их всегда есть определенное количество), предоставляя лямбда кортежу в качестве аргумента:

 >>> a = [[1,2,3],[4,5,6]] >>> N = 10 >>> filter(lambda (i, j, k): i + j + k > N, a) [[4, 5, 6]] 

Если вы укажете «lambda i, j, k», как вы пытались это сделать, вы говорите, что лямбда получит три аргумента. Но фильтр будет давать лямбда каждому элементу a, то есть одному подсписку за раз (таким образом, вы получили ошибку). Включив аргументы в лямбда в круглых скобках, вы говорите, что лямбда получит один аргумент, но вы также называете каждый из его компонентов.

Вы можете сделать что-то вроде

 >>> a=[[1,2,3],[4,5,6]] >>> filter(lambda (x,y,z),: x+y+z>6, a) [[4, 5, 6]] 

Использование синтаксиса деконструкции.

Попробуйте что-то вроде этого:

 filter(lambda a: a[0] + a[1] + a[2] >= N, a) 

Используйте функцию вместо лямбда, затем myVar = a[0] и т. Д.

Как насчет этого?

filter(lambda b : reduce(lambda x, y : x + y, b) >= N, a)

Это не отвечает на заданный вопрос, я знаю, но он работает для произвольно длинных списков и произвольно-длинных подсписок и поддерживает любую операцию, которая работает в режиме reduce() .

Хорошо, очевидно, вы знаете, что можете использовать sum . Цель того, что вы пытаетесь сделать, кажется немного расплывчатой, но я думаю, что необязательный синтаксис параметра может помочь вам или, по крайней мере, дать вам некоторое вдохновение. Если вы помещаете * перед параметром, он создает кортеж из себя и всех остальных параметров. Если вы поместите перед ним ** , вы получите словарь.

Чтобы увидеть это:

 def print_test(a,b,c,*d): print a print b print c print d print_test(1,2,3,4,5,6) 

печать

 1 2 3 (4, 5, 6) 

Этот синтаксис можно использовать и с lambda .

Как я уже сказал, я не уверен, что вы пытаетесь сделать, но похоже, что это может помочь. Я не думаю, что вы можете получить локальные назначения переменных в lambda без какого-либо взлома, но, возможно, вы можете использовать это, чтобы каким-то образом присвоить значения переменным.

Edit: Ах, я понимаю, что вы ищете moreso сейчас. Я думаю, вы хотите:

 lambda (a, b, c): a+b+c > N 
  • Транспонирование матрицы в Python
  • Python для понимания словарей в словарях?
  • больше pythonic версии итерации списка
  • список вызовов функции, использующей понимание списка
  • Список понятий и условий?
  • Элегантный способ удаления элементов в списке, которые не имеют подстрок, которые отображаются в другом списке
  • Понимание переменных нескольких переменных
  • Учет списка и функция, возвращающая несколько значений
  •  
    Interesting Posts for Van-Lav

    Не удается запустить pywin32 post install

    Python Selenium: найти атрибуты объекта с помощью xpath

    Как создать диагональную разреженную матрицу в SciPy

    Как имитировать ошибки соединения и таймауты запросов в модульных тестах python

    Отправлять видео через TCP с помощью OpenCV и сокетов в Raspberry Pi

    CRITICAL: tensorflow: Категория не имеет изображений – валидация

    Создать (нормальное / безопасное) имя файла из любой (небезопасной) строки

    ocr'ing текст приложения (не сканированный, НЕ captchas)

    Ошибка синтаксиса в библиотеке jinja 2

    Проверка списка прокси-сервера python

    Как переопределить сообщение об ошибке «уникальное» django для имени пользователя в пользовательском UserChangeForm

    Печать кодированной строки utf-8

    Как заменить в группу регулярных выражений в Python

    Сценарий IDLE Python не показывает вывод подпроцесса, но cmd.exe делает

    Сортированная функция с использованием функции сравнения

    Python - лучший язык программирования в мире.