操作for循环的输出(如果有的话)



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

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

至:

folder = 'sphere_v002'

然后处理包含CCD_ 4的列表项。

我有一个工作功能,但我想改进它

当前代码为:

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

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

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

您可以使用生成器并利用None是"Falsy"的事实:

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

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

正如jpp所指出的,any只是返回一个布尔值。因此,在这种特殊情况下,如果有的话,就不是一个好的解决方案。

正如作者所建议的,到目前为止,对我们来说最有效的代码是使用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_']

相关内容

  • 没有找到相关文章

最新更新