我的python“in”关键字出了什么问题?

时间:2017-03-17 16:06:49

标签: python list for-loop

我是Python的新手,我知道“in”这个词用于查看字符串是否是另一个字符串的子字符串。但是,当我像这样使用“in”时,发生了一些事情:

Input:

c=['1234444', '56788888', '99999900']
print "dddd" in c[0] 
print "ffffff" in c[1]
print np.arange(len(c)-1 ) 
if((("ddd" in c[i]) and ("fffff" in c[i+1]))for i in np.arange(len(c)-1 )):
    print c
    print "Something wrong"

Output:

False
False
[0 1]
['1234444', '56788888', '99999900']
Something wrong

为什么if子句是“True”?不应该是假的吗?有人可以帮帮我吗?提前谢谢。

3 个答案:

答案 0 :(得分:2)

((("ddd" in c[i]) and ("fffff" in c[i+1]))for i in np.arange(len(c)-1 ))

是一个发电机。

如果你这样做

if((("ddd" in c[i]) and ("fffff" in c[i+1]))for i in np.arange(len(c)-1 ))

你没有迭代生成器,你基本上是在说“这个生成器是什么东西*”,它就是这样。

(*其中“某事物”不是None或零或空容器或其他一些虚假对象)

如果要检查生成器中的所有内容是否为真,可以使用all

if all((("ddd" in c[i]) and ("fffff" in c[i+1]))for i in np.arange(len(c)-1 ))

如果要检查生成器中是否有任何内容,可以使用any

if any((("ddd" in c[i]) and ("fffff" in c[i+1]))for i in np.arange(len(c)-1 ))

答案 1 :(得分:1)

你制作了一个生成器表达式但是你不会循环它。生成器对象不是空的'所以True。否则,生成器表达式中的表达式永远不会执行。

例如:

>>> gen = (False for _ in range(0))  # always false *and* empty
>>> bool(gen)
True

也许您在寻找any() function?如果它的任何值为真,它将遍历其参数并返回True

if any("ddd" in c[i] and "fffff" in c[i+1]) for i in np.arange(len(c)-1)):
    print "Never reached"

有相应的all() function

答案 2 :(得分:1)

对您的问题采用不同的方法。

你正在喂("ddd" in c[i]),这会导致"错误"和("fffff" in c[i+1])也会产生"错误"如果声明。

基本上你说的是

if((False and False)for i in np.arange(len(c)-1 )):

现在,假和假=假

>>> False and False
False

所以你的if语句减少为

if( False for i in np.arange(len(c)-1 )):

以上列表理解等同于:

temp = []
for i in np.arange(len(c)-1 ):
temp.append(False)

以上结果为True。即你正在附加" False" for for循环的每次迭代  因此if中的以下语句被执行。

print c
print "Something wrong"