2014-09-16 4 views
0

Я знаю, что это, вероятно, можно сделать в одной строке, и это довольно просто, но я продолжаю синтаксис. Я хочу сделать следующее:Одна строка для поиска цикла в python

for tag in TAGS.values(): 
    if tag in myset: 
     found_tag = tag 
     break 

Я пытался что-то вроде

found_tag = tag if tag in myset for tag in TAGS.values() 

Но я получаю ошибки синтаксиса на for. Есть ли один способ сделать это в python?

+0

вы хотите для цикла остановки ('break'), как только он нашел первый' 'tag' в myset'? – Vor

+0

@Vor да, это было бы здорово, потому что я знаю, что будет только одно решение, должен был быть разрыв в этом цикле, отредактируйте, чтобы точно отразить – sedavidw

ответ

4

Если вы хотите, чтобы получить первый удовлетворительный тег, а затем остановиться, используйте next.

found_tag = next((tag for tag in TAGS.values() if tag in myset), None) 

Это даст None, если таких тегов не найдено.

Если вы хотите, чтобы получить все теги соответствия, вы можете сделать это:

found_tags = [tag for tag in TAGS.values() if tag in myset] 
+0

это именно то, что я хотел, спасибо! – sedavidw

+0

@sedavidw, добро пожаловать =) – khelwood

1

Вам не нужны квадратные скобки, а if лучше всего разместить в конце. Попробуйте:

found_tag = [tag for tag in TAGS.values() if tag in myset] 

Еще один способ справиться с этим, чтобы использовать набор операций (необходимо использовать set() конструктор, только если переменные не являются уже сетов):

found_tag = (set(TAGS.values()) & set(myset)) 

Вы можете использовать .pop() для получить только товар, если есть только один:

found_tag = (set(TAGS.values()) & set(myset)).pop() 
+1

Мне было интересно, если бы был способ не иметь его в списке , Очевидно, что я могу просто индексировать этот список, но я знаю, что у вышеуказанного кода будет только один ответ, поэтому нет необходимости иметь его в списке. Думаю, мне придется жить с этим. Спасибо за помощь – sedavidw

Смежные вопросы