Попробуйте переименовать один из ваших конфликтующих 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
, а строка не фильтруется.