Pythonic получить элемент массива или по умолчанию, если он не существует - PullRequest
2 голосов
/ 07 июня 2011

У нас есть

matches = re.findall(r'somewhat', 'somewhere')

Можем ли мы упростить это

if len(matches) > index:
    return matches[index]
else:
    return 'default'

или

return matches[index] if len(mathes) > index else 'default'

на что-то похожее на JS

return matches[index] || 'default'

что мы можем просто использовать

return 'somewhere'.match(/somewhat/)[index] || 'default'

Ответы [ 3 ]

4 голосов
/ 07 июня 2011

Как-то так может помочь:

>>> reg = re.compile('-\d+-')
>>> reg.findall('a-23-b-12-c') or ['default']
['-23-', '-12-']
>>> reg.findall('a-b-c') or ['default']
['default']

Редактировать

Гадкий однострочный

(reg.findall('a-b-c')[index:] or ['default'])[0]
1 голос
/ 07 июня 2011

Я бы соблазнился попробовать, кроме блока. Вы должны были бы рассмотреть, когда индекс был отрицательным, хотя. Это ошибка или приемлемый ввод?

Но сработает следующее:

try:
    return re.findall(r'somewhat', 'somewhere')[index]
except IndexError:
    return 'default'

Предполагается, что это предпочтительный способ, если вы беспокоитесь об эффективности, так как он избегает проверки границ массива дважды (один раз, когда вы делаете это вручную, и второй, когда python также выполняет свою внутреннюю проверку).

edit: мне никогда не нравился этот способ, поскольку он скрывает любые ошибки IndexError, генерируемые вложенными вызовами, и возвращает значение по умолчанию (что, я сомневаюсь, будет желаемым поведением и возможным источником ошибок).

0 голосов
/ 07 июня 2011

Не совсем, потому что при запуске mathes[x] с недопустимым индексом выдается IndexError, который не возвращает False.

...