Так как вам нужно проверить все соответствующие записи в любом случае, лучшим вариантом является использование прямой вверх for
петлю; вспыхнуть, когда условие None
не соблюдено:
found = None
for entry in mylist:
if entry[2] == 'Project A':
if entry[1] is None:
print 'No match'
break
if not found or entry > found:
found = entry
else:
# only executed when there was no break!
print found or 'No match'
else
ветвь for
цикла выполняется только тогда, когда цикл for
завершения итерации. Это произойдет только в том случае, если было найдено Project A
записей, где t[1]
был установлен в None
.
Поскольку все еще существует вероятность того, что есть 0 записей, которые соответствуют названию проекта, found
настроен на None
; это None
, когда вы достигнете else
, блокируйте цикл, если никакие записи не должны совпадать.
Demo, перевернув нашел None
случай в виде исключения, чтобы показать разницу:
>>> def find_max_project(projects, target):
... found = None
... for entry in projects:
... if entry[2] == target:
... if entry[1] is None:
... raise ValueError('no match')
... if not found or entry > found:
... found = entry
... else:
... return found
...
>>> find_max_project([(1, None, "Project A"), (2, 3, "Project A"), (3, 6, "Project B")], 'Project A')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 7, in find_max_project
ValueError: 'no match'
>>> find_max_project([(1, 4, "Project A"), (2, 3, "Project A"), (3, 6, "Project B")], 'Project A')
(2, 3, 'Project A')
>>> find_max_project([(1, 2, "Project A"), (1, 3, "Project A")], 'Project A')
(1, 3, 'Project A')
>>> find_max_project([(1, 2, "Project B"), (1, 3, "Project B")], 'Project A')
>>> find_max_project([(1, 2, "Project B"), (1, 3, "Project B")], 'Project A') is None
True
Обратите внимание, что в этой версии мы не даже действительно нужно поставить последнюю строку в else
блоке больше , поскольку использование исключения завершает функцию теперь.
Если ваш код работает, отправить его на HTTP: //codereview.stackexchange.com/ для предложений об улучшениях. – ILostMySpoon
@ILostMySpoon: вопрос совершенно по теме, и это всего лишь небольшой фрагмент. Это не подходит для КР. Можете ли вы просмотреть CR [справочную информацию по теме] (http://codereview.stackexchange.com/help/on-topic), прежде чем рекомендовать людям перепродавать там? –
@MartijnPieters * ".. это всего лишь небольшой фрагмент. Это не подходит для CR, поэтому" * - насколько я могу сказать, вопрос по теме на обоих сайтах. Где вы читали об исключении «небольших фрагментов»? – jfs