从迭代器获取迭代器

时间:2019-04-29 15:43:17

标签: python iterator any

我有这个简单的功能:

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

2 个答案:

答案 0 :(得分:2)

代替

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。 / p>

这在这里看起来没什么用,但是当您想要满足条件的序列中的第一个元素以及没有此类元素的情况下进行后备操作时,它确实很方便:

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()))

答案 1 :(得分:2)

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