Python: как ссылаться на объект из итерации any()

Я пытаюсь сослаться на объект, для которого я сопоставляю.

import re
list = ["abc","b","c"]
if any(re.search(r"a",i) for i in list):
    print("yes")
    print(i)

Это работает, но не последняя команда print.

Есть ли способ сделать то, что я пытаюсь сделать здесь?

Ну вы знаете, что такое i, это "a"; просто print("a")! В общем, вы не можете сделать это, пока не прибудет выражения присваивания, если только вы не развернете цикл в простой код.

jonrsharpe 22.02.2019 14:21

В частности, python.org/dev/peps/pep-0572/#целевой объем показывает пример захвата такого any свидетеля.

chepner 22.02.2019 14:41
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
3
2
44
2

Ответы 2

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 22.02.2019 14:37

@chepner Спасибо - однажды я увидел вопрос о том, что any() больше не выходит во внешнюю область видимости - хотя сейчас не могу найти его для связи

Patrick Artner 22.02.2019 14:43

Если мне не изменяет память, проблема в том, что в Python 2 переменная находится в локальной области видимости, где используется генератор (которая будет той же областью, в которой вызывается any). В Python 3 выражение генератора создает собственную новую область видимости, в которой живут переменные.

chepner 22.02.2019 14:46

Другие вопросы по теме