Pythonic получает элемент массива или по умолчанию, если он не существует

#python #list #element #default

#python #Список #элемент #По умолчанию

Вопрос:

У нас есть

 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'
  

Комментарии:

1. Это решение на JavaScript работает не во всех случаях (например, когда mathes[index]==0 ).

2. Согласен. Не во всех, но в большинстве практических случаев.

Ответ №1:

Что-то вроде этого может помочь:

 >>> 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. О, не знал, что пустые массивы считаются ложными. Спасибо

Ответ №2:

У меня был бы соблазн использовать блок try except. Однако вам потребуется учитывать, когда индекс был отрицательным. Это ошибка или приемлемый ввод?

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

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

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

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

Комментарии:

1. Я считаю, что использование try-except s менее эффективно, чем проверка длины массива (даже дважды)

2. Хм, возможно, вы правы. Я думаю, что я провел ложную аналогию с dicts, где try / except лучше, чем d.has_key(k) / d [k].

3. Я провел несколько тестов. Ответ зависит от того, что вы считаете наиболее вероятным результатом. При наличии индекса блок try / except выполняется в два раза быстрее, чем проверка границ списка. Когда он отсутствует, блок try / except работает в 5 раз медленнее.

Ответ №3:

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