2016年4月27日星期三

解决一次python报错ValueError: list.remove(x): x not in list的问题

公司里勤劳帅气却老是走神的小周同志又来了!

这次是这样的,比较两个规模比较大的List A和B, A中的元素e1前几个字符跟B中的元素e2前几个字符(形如thesamewords_______)匹配的话,输出e1到一新的List,同时对A和B进行更新(删除)。注意重复的情况。

思路很简单喽,两层for循环,匹配字符串前N位,if语句判断是否匹配,匹配的话加入新的list同时更新原来的List。简单写的代码如下,


l1 = ['aaaaaad', 'COFREP-B00000390-2015-05-SLCRXX-00-L-N--.zip', 'c', 'd']
l2 = ['aaaaaac', 'sada', 'dadada', 'da', 'di']
for e1 in l1:
    for e2 in l2:
        if e1[:6] == e2[:6]:
            l1.remove(e1)
            l2.remove(e2)
            l3.append(e1)
print l1
print l2

print l3

结果很理想,如下,

['COFREP-B00000390-2015-05-SLCRXX-00-L-N--.zip', 'c', 'd']
['sada', 'dadada', 'da', 'di']
['aaaaaad']

[Finished in 0.1s]

小测试完毕,更新list数据源,重新运行,就报错啦,唯一有用的一行是,
ValueError: list.remove(x): x not in list

测试多组数据,还是没有解决,跟HR美女姐姐吃饭去了。重点是,吃完饭回来,短短几分钟就找到了bug所在,到底还是美女的力量大!

说说我是怎么测试找出来的吧——————控制变量法,小学就学过的,

保持l1不变,更改l2的数据。简例中匹配的是aaaaaa___,因此l2中的aaaaaac被删除了,l1中的aaaaaad也被删除了,l3中有了aaaaaad。当l2 =  ['aaaaaac', 'aaaaaae', 'sada', 'dadada', 'da', 'di']时,即出现第二个aaaaaa___时,如上的错误再次出现了!兴奋!

用脚指头想象一下,l1[0]匹配到l2[0]的时候,分别对其执行remove(e1)和remove(e2)操作(l1[0]和l2[0]都被删除了),但是此时第二层loop还没有结束,又匹配到了l2[1](aaaaaae),此时会再次对l1执行操作remove(e1),一个完美的扑空!l1中已经没有删掉的e1了,因此报错。

To solve this bug, just one finger! may be five,

break

在if层末尾加上break结束语句就好啦!

一次多么絮絮叨叨又二逼的简单错误。


没有评论:

发表评论