получение итератора, если есть () - PullRequest
1 голос
/ 29 апреля 2019

У меня есть эта простая функция:

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 in my_list:
    print x

Ответы [ 2 ]

2 голосов
/ 29 апреля 2019

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
2 голосов
/ 29 апреля 2019

Вместо

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