首页 > 代码库 > python中判断语句用两个or连接的奇葩

python中判断语句用两个or连接的奇葩

学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并没起作用,交换顺序也没区别,具体原因是什么暂时不清楚。