Python:any()语句未按预期返回true

时间:2018-02-09 09:57:09

标签: python python-3.x

我必须检查一行中是否有多个字符串。第一个任何语句按预期返回true,但第二个返回false并且我不知道为什么,也许这是一个非常愚蠢的错误......

lines[-10] = 'Step   0:     3'
lines[-1]  = 'Step   9:    30'

我在做什么:

with open('stdout.txt', 'r') as f:
    lines = f.readlines()

print(inputs)
if set(inputs) == set(['10', '3', '+']):
    if any(x in ['0:', '3'] for x in lines[-10]):
        print('ok')
        test = True
    else:
        print('error')
        test = False


    print(lines[-1])
    #if '30' in lines[-1] and '9:' in lines[-1]: returns true !!!
    if any(x in ['9:', '30'] for x in lines[-1]):
        print('ok')
        test = test & True
    else:
        print('error')
        test = test & False

正如您在示例中所看到的,如果我自己检查每个值,它就可以工作。

4 个答案:

答案 0 :(得分:2)

也许你的意思是:

if any((term in lines[-10]) for term in ['0:', '3']):
# etc

#if '30' in lines[-1] and '9:' in lines[-1]: returns true !!!
if any((term in lines[-10]) for term in ['9:', '30']):

答案 1 :(得分:2)

x for x in "somestring"会产生somestring的每个个人字符:

for x in 'Step   9:    30':
    print("x is '{}'.format(x))

现在显然,由于['9:', '30']是两个字符的字符串列表,'Step 9: 30'的单个字符都不是它的元素。

答案 2 :(得分:1)

正如其他答案中所解释的那样x for x in 'string'会产生个别字符,这些字符永远不会与例如' 9:'或者' 30',第一个any()有效,因为您将x与' 3'进行比较。相反,你可以这样做:

if any(x in lines[-1] for x in ['9:','30']):
    do_stuff...

答案 3 :(得分:0)

如果你在这里提供最低限度的案例,我想你可以自己弄清楚。

In [3]: any(x in ['9:', '30'] for x in line[-1])
Out[3]: False

In [4]: any(x in ['9:', '30'] for x in line)
Out[4]: False

In [5]: line = 'Step   9:    30'

In [6]: any(x in ['9:', '30'] for x in line)
Out[6]: False

In [7]: for x in line:
   ...:     print(x)
   ...:
S
t
e
p



9
:




3
0

In [8]: x = "9"

In [9]: x in ['9:', '30']
Out[9]: False

In [10]: x in '9:3-'
Out[10]: True

因此,对于字符串,如果你迭代它,你将获得char,并且对于项目列表(如['9:', '30']),你将获得项目('9:', '30')。

您可以在Python控制台中试用它。