操纵if循环的输出

时间:2018-11-09 12:35:59

标签: python match any

我需要比较以下sequences列表项:

sequences = ['sphere_v002_', 'sphere_v002_0240_', 'test_single_abc_f401']

收件人:

folder = 'sphere_v002'

,然后处理包含folder的列表项。

我为此具有工作功能,但我想对其进行改进。

当前代码为:

foundSeq = False

for seq in sequences:
    headName = os.path.splitext(seq.head())[0]

    #Check name added exception for when name has a last underscore                 
    if headName == folder or headName[:-1] == folder:
        foundSeq = True
        sequence = seq

if not foundSeq:
    ...

我的进步看起来像这样:

if any(folder in os.path.splitext(seq.head())[0] for seq in sequences):
    print seq

但是随后出现以下错误:

local variable seq referenced before the assignment

如何使用改进的解决方案获得正确的输出?

2 个答案:

答案 0 :(得分:1)

any仅返回一个布尔值,满足条件时,它不会将seq中的元素存储在变量sequences中。

您可以做的是使用生成器并利用None是“虚假”的事实:

def get_seq(sequences, folder):
    for seq in sequences:
        if folder in os.path.splitext(seq.head())[0]:
            yield seq

for seq in get_seq(sequences, folder):
    print seq

如果愿意,可以将其重写为生成器表达式:

for seq in (i for i in sequences if folder in os.path.splitext(i.head())[0]):
    print seq

如果从不指定条件,则生成器或生成器表达式将不会产生任何值,并且循环内的逻辑也不会得到处理。

答案 1 :(得分:0)

jpp指出,any仅返回一个布尔值。因此,在这种情况下,如果不是很好的解决方案。

就像thebjorn所建议的那样,到目前为止,对我们来说最有效的代码是使用filter函数。

sequences = ['sphere_v002_', 'sphere_v002_0240_', 'test_single_abc_f401']
match = filter(lambda x: 'sphere_v002' == x[:-1] or 'sphere_v002' == x, sequences)
print match
['sphere_v002_']