Фильтр не может выбрать данные на основе длины в Python? - PullRequest
0 голосов
/ 13 июня 2018

Код:

def match(i,arr=arr):
    tmp = filter(lambda x: len({*i} & {*x})==4,arr)
    for i in tmp:
        print(i)

t_arr = np.array([[10, 11 ,12 ,13 ,26 ,28],[10, 13 ,18 ,26 ,28, 30]])
match((10, 11, 12, 13),arr=t_arr)

result:
[10 11 12 13 26 28]
[10 13 18 26 28 30]

Я хочу выбрать элементы, пересекающие целевую единицу (10,11,12,13).Длина нового пересекаемого элемента должна быть 4. Но мой код не может исключить [10, 13 ,18 ,26 ,28, 30]len({*(10,11,12,13)}&{*[10, 13 ,18 ,26 ,28, 30]} получить 2, что кажется странным.

Надежда:

Решить проблему и объяснить, почему мой код не работает.

1 Ответ

0 голосов
/ 13 июня 2018

Попробуйте переименовать один из ваших конфликтующих i s:

def match(i,arr=arr):
    tmp = filter(lambda x: len({*i} & {*x})==4,arr)
    for j in tmp:
        print(j)

t_arr = np.array([[10, 11 ,12 ,13 ,26 ,28],[10, 13 ,18 ,26 ,28, 30]])
match((10, 11, 12, 13),arr=t_arr)

Отпечатки:

[10 11 12 13 26 28]

Что пошло не так в исходном коде?

Давайте проверим:

>>> def match(i,arr=arr):
...     tmp = filter(lambda x: print('i:', i) or print('x:', x) or len({*i} & {*x})==4,arr)
...     for i in tmp:
...         print(i)
... 
>>> t_arr = np.array([[10, 11 ,12 ,13 ,26 ,28],[10, 13 ,18 ,26 ,28, 30]])
>>> match((10, 11, 12, 13),arr=t_arr)
i: (10, 11, 12, 13)
x: [10 11 12 13 26 28]
[10 11 12 13 26 28]
i: [10 11 12 13 26 28]
x: [10 13 18 26 28 30]
[10 13 18 26 28 30]

Мы можем видеть, что при входе в цикл из-за неудачного имени clash i в лямбде перезаписывается результатом предыдущей итерации.По совпадению, в двух строках arr_t оказалось ровно четыре общих элемента.Таким образом, на последней итерации условие оценивается как true, а строка не фильтруется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...