Я пытаюсь сослаться на объект, для которого я сопоставляю.
import re
list = ["abc","b","c"]
if any(re.search(r"a",i) for i in list):
print("yes")
print(i)
Это работает, но не последняя команда print.
Есть ли способ сделать то, что я пытаюсь сделать здесь?
В частности, python.org/dev/peps/pep-0572/#целевой объем показывает пример захвата такого any свидетеля.






any только говорит вам, выполнило ли что-нибудь условие, это не позволяет вам получить значение. Самый питонический способ сделать это, вероятно, таков:
try:
i = next(i for i in list if i == 'a')
print(i)
except StopIteration:
print('No such thing')
Если вам не нравится исключение и вы предпочитаете использовать if:
i = next((i for i in list if i == 'a'), None)
if i:
print(i)
Переменные из any() не выходят за его пределы — они известны только внутри него.
Вы просто сопоставляете простые буквы - вы можете получить все элементы из своего списка, в которых есть эта буква, используя понимание списка:
my_list = ["abc","b","c","abracadabra"]
with_a = [ item for item in my_list if "a" in item] # or re.find ... but not needed here
# this prints all of them - you can change it to if ...: and print(with_a[0])
# to get only the first occurence
for item in with_a:
print("yes")
print(item)
Вывод:
yes
abc
yes
abracadabra
Точнее, переменные не выходят из выражения генератора, значение которого является просто аргументом для any.
@chepner Спасибо - однажды я увидел вопрос о том, что any() больше не выходит во внешнюю область видимости - хотя сейчас не могу найти его для связи
Если мне не изменяет память, проблема в том, что в Python 2 переменная находится в локальной области видимости, где используется генератор (которая будет той же областью, в которой вызывается any). В Python 3 выражение генератора создает собственную новую область видимости, в которой живут переменные.
Ну вы знаете, что такое
i, это"a"; простоprint("a")! В общем, вы не можете сделать это, пока не прибудет выражения присваивания, если только вы не развернете цикл в простой код.