操作 if any for 循环的输出
Manipulate the output of if any for loop
我需要比较以下 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
如何使用改进的解决方案获得正确的输出?
any
returns 只是一个布尔值,它不会存储在变量 seq
当你的条件满足时 sequences
内的元素。
你可以做的是使用生成器并利用事实 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
只是 return 一个布尔值。因此,在这种特殊情况下,if 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_']
我需要比较以下 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
如何使用改进的解决方案获得正确的输出?
any
returns 只是一个布尔值,它不会存储在变量 seq
当你的条件满足时 sequences
内的元素。
你可以做的是使用生成器并利用事实 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
只是 return 一个布尔值。因此,在这种特殊情况下,if 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_']