фильтровать элементы из списка списков в 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? Что-то вроде почтового индекса, но для произвольно длинных списков.

спасибо,

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

9
задан 16 April 2010 в 20:37
поделиться

7 ответов

Использование лямбда с фильтром выглядит глупо, когда у нас есть другие методы.

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

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

Если бы мне действительно была нужна функция, я мог бы использовать кортеж аргументов распаковка (которая, кстати, удалена в 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.

35
ответ дан 4 December 2019 в 06:05
поделиться

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

0
ответ дан 4 December 2019 в 06:05
поделиться

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

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

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)

Вы также можете использовать этот синтаксис с лямбда .

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

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

lambda (a, b, c): a+b+c > N
0
ответ дан 4 December 2019 в 06:05
поделиться

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

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

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

1
ответ дан 4 December 2019 в 06:05
поделиться

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

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

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

10
ответ дан 4 December 2019 в 06:05
поделиться

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

filter(lambda a: a[0] + a[1] + a[2] >= N, a)
0
ответ дан 4 December 2019 в 06:05
поделиться

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

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

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

1
ответ дан 4 December 2019 в 06:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: