Утверждение списка, содержащего строки определенной длины

#python

#python

Вопрос:

У меня есть список строк, и я хочу убедиться, что нет строки длиной> 20, поэтому я сделал следующее :

 assert not any(name for name in my_list if len(name) > 20)
 

кажется, это работает, но когда я делаю следующее, это работает не так, как ожидалось, не должно работать?:

 assert any(name for name in my_list if not len(name) <= 20)
 

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

1. Во 2-м случае вы должны использовать all вместо any

Ответ №1:

Более простой способ сделать это:

 assert not any(len(name) > 20 for name in my_list)
 

Это просто проверяет каждое имя, пока не найдет одно длиннее 20 символов.

Но лучший способ сделать это:

 assert all(len(name) <= 20 for name in my_list)
 

Это позволяет избежать необходимости инвертировать тест.

Ответ №2:

кажется, это работает, но когда я делаю следующее, это работает не так, как ожидалось, не должно работать?:

Нет! if len(name) > 20 в точности идентично по функционированию if not len(name) <= 20 .

Таким образом, фактически, второе утверждение является утверждением, обратным первому утверждению. очевидно, что будет работать только один.

Кроме того, вы фильтруете список для просмотра, удаляя элементы, длина которых превышает 20. Для обратного, вы должны пытаться убедиться, что ни один из элементов не был отфильтрован — и это может не делать то, что вы хотите, если вы используете any(..)


То, что вы, вероятно, ищете, это:

 assert all(len(name) <= 20 for name in my_list)  # Note that this expression is different.