代码:
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,这看起来很奇怪。
希望:
解决问题并解释我的代码失败的原因。
答案 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
,并且该行不会被过滤掉。