学python的时候犯的一个错误,放在这吧。就是在循环某个列表的时候不要去操作它,这是容易忽略的一个地方。所以如果要操作某个列表本身,那么先把该列表copy一份,然后再读取的时候读copy的那份。操作原来的列表。
正确的如下:
import re a="hen/zg /zg qd/a /a ,/x /x hen/zg /zg xh/v /v " b=re.split('[ ]', a) b_copy=b[:] print b cixing=["/x","/zg","/uj","/ul","/e","/d"] for seg in b_copy: for k in cixing: if k in seg: b.remove(seg) print b
分割线...........................................................................................................
首先来看问题,在做完词性标注后,我要将部分词性的词去掉,如代码中,列表cixing所示:if的判断语句不能只用 k in seg,因为,这种情况不能去除k==seg的情况。所以需要两个判断语句
即:if k==seg or k in seg:
好的,问题来了,请看测试结果
import re a="hen/zg /zg qd/a /a ,/x /x hen/zg /zg xh/v /v " b=re.split('[ ]', a) print b cixing=["/x","/zg","/uj","/ul","/e","/d"] for seg in b: for k in cixing: if k==seg or k in seg: b.remove(seg) print b
['hen/zg', '/zg', 'qd/a', '/a', ',/x', '/x', 'hen/zg', '/zg', 'xh/v', '/v', ''] ['/zg', 'qd/a', '/a', '/x', '/zg', 'xh/v', '/v', ''] [Finished in 0.0s]
看另一种,我把判断语句写成K==seg,不加后面的k in seg:
1 import re 2 3 a="hen/zg /zg qd/a /a ,/x /x hen/zg /zg xh/v /v " 4 b=re.split('[ ]', a) 5 print b 6 cixing=["/x","/zg","/uj","/ul","/e","/d"] 7 for seg in b: 8 for k in cixing: 9 if k==seg: 10 b.remove(seg) 11 print b
['hen/zg', '/zg', 'qd/a', '/a', ',/x', '/x', 'hen/zg', '/zg', 'xh/v', '/v', ''] ['hen/zg', 'qd/a', '/a', ',/x', 'hen/zg', 'xh/v', '/v', ''] [Finished in 0.0s]
显然,在用or连接两个判断语句的时候,k==seg并没起作用,交换顺序也没区别,具体原因是什么暂时不清楚。