Использование списков и исключений?
Хорошо, скажем, у меня есть список, и я хочу проверить, существует ли этот список в другом списке. Я могу это сделать:
all(value in some_map for value in required_values)
Это работает отлично, но позволяет сказать, что я хочу, чтобы исключение было вызвано, когда требуемое значение отсутствует, со значением, которое оно отсутствует. Как я могу это сделать, используя понимание списка?
Мне более или менее любопытно, все признаки, похоже, указывают на нет.
EDIT Argh Я имел в виду это:
for value in required_values: if value not in some_map: raise somecustomException(value)
Глядя на тех, кого я не вижу, как я могу найти значение, где произошла ошибка
- Список списков в списке кортежей, переупорядоченных
- Сравните 2 списка, чтобы найти равное или приблизительное соответствие, не делая N ^ 2 итерации
- Как обеспечить список содержит уникальные элементы?
- Разбиение и манипулирование индексом списка Python
- Повторите все элементы на основе списка значений
скажем, я хочу повысить исключение, когда требуемое значение отсутствует, со значением, которое оно отсутствует. Как я могу это сделать, используя понимание списка?
Сопоставление списков – это синтаксически сжатый способ создания списка на основе какого-либо существующего списка – они не являются универсальным способом написания любого for
-loop в одной строке. В этом примере вы фактически не создаете список, поэтому не имеет смысла использовать понимание списка.
Вы не можете использовать рейз в понимании списка. Вы можете проверить себя, посмотрев грамматику в справочнике по языку Python .
Однако вы можете вызвать функцию, которая вызывает для вас исключение.
Если вы не хотите рассматривать дубликаты и значения хешируются, используйте наборы. Они легче, быстрее и могут извлекать «все» элементы, отсутствующие за одну операцию:
required_values = set('abc') # store this as a set from the beginning values = set('ab') missing = required_values - values if missing: raise SomeException('The values %r are not in %r' % (missing, required_values))
Другой (уродливой) возможностью будет функция error_on_false
:
def error_on_false(value) if value: return value else: raise Exception('Wrong value: %r' % value) if all(error_on_false(value in some_map) for value in required_values): continue_code() do_something('...')
Это уродливо. Вместо этого я бы использовал set
.
Мне было интересно сегодня вечером. Мой вариант использования – итерирование по списку объектов и повышение ошибки, когда объект не был определенного типа. Мое решение – использовать генератор.
def iter_my_class(my_class_list): for c in my_class_list: if not isinstance(c, MyClass): raise ValueError('Expected MyClass') yield c
Затем используется как
classes = [c for c in iter_my_class(my_class_list)]
Я написал это на своем телефоне. Если это бежит без ошибок, вы все должны мне пива.
Хотя я думаю, что использование наборов (например, пример nosklo) лучше, вы можете сделать что-то простое:
def has_required(some_map, value): if not value in some_map: raise RequiredException('Missing required value: %s' % value) all(has_required(some_map, value) for value in required_values)
- Чтение строк из файла в виде сдвигового регистра с двумя ячейками в Python
- Открыть страницу программно в python
- Ошибка Newcomer при разборе tweet json UnicodeEncodeError: кодек «charmap» не может кодировать символы в позиции 13-63: карты символов для <undefined>
- Python проверяет первый и последний индекс списка
- Python – преобразовать список в список списков с каждой записью, содержащей уникальные комбинации
- Подсчет количества гласных в объединенной строке
- Как сравнить два списка в python и совпадениях возврата
- Странное поведение массива Python?
- Элегантный способ нарезать список с условием
- Как удалить элемент списка из списка списка в python
- Список питонов по значению не по ссылке