我有这个简单的功能:
keys = ['snmt1/metadata/table1/ref_table1_20190324124365.csv', 'snmt1/metadata/table2/table2_ref_20190324124365.csv', 'snmt1/metadata/table3/table3_20190324124365.csv']
def better_func(keys):
for item in keys:
split_key = item.split("/")
filename = str(split_key[-1])
prefixes = ['strm','ref','trunc']
if any(x in filename for x in prefixes):
location = filename.find(x)
if location == 0:
print True
else:
print "another false"
else:
print False
我需要的是“x”的值,以便我可以使用.find()函数返回它的索引。上面的代码不起作用,因为它告诉我:
NameError:未定义全局名称“x”
我理解但我怎么能像通常在for循环中那样访问“x”?
for x in my_list:
print x
代替
if any(x in filename for x in prefixes):
# do stuff with x
你可以做:
x = next((p for p in prefixes if p in filename), None)
if x:
# do stuff with x
这将创建一个生成器,并从中获取下一个值 - 即第一个值。 None
的第二个参数是一个哨兵值:如果迭代器引发一个StopIteration
,而不是传递这个异常,那么返回None
,并绑定到x
。
这在这里看起来并不那么有用,但是如果你想要一个满足条件的序列的第一个元素,并且如果没有这样的元素则需要回退操作,它真的很方便:
elt = next((x for x in range(10) if x > 5), None)
if elt is not None:
print("{} satisfies the condition".format(elt))
else:
print("No such element found")
请注意,生成器也是迭代器,因此您可以直接在它们上调用next
。使用像列表,字典或其他任何东西的迭代,你需要先调用iter
。例如,从字典中获取任意值非常有用:
value = next(iter(d.values()))
Python 3.8(将于2019年末发布)将提供赋值表达式,部分用于解决命名证人到any
成功的确切用例。
import os
def better_func(keys):
prefixes = ['strm', 'ref', 'trunk']
for item in keys:
filename = os.path.basename(item)
if any((found := x) for x in prefix if x in filename):
if filename.startswith(found):
print True
else:
print "another false"
else:
print False