过滤器无法根据python中的长度选择数据?

时间:2018-06-13 01:25:42

标签: python numpy

代码:

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]

我想选择与目标1(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 :(得分:1)

尝试重命名一个有冲突的i

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]

我们可以看到,当我们进入循环时,因为lambda中的不幸名称冲突i被前一次迭代的结果覆盖。巧合的是,arr_t这两行恰好有四个共同的元素。因此,在最后一次迭代中,条件的计算结果为true,并且该行不会被过滤掉。