Вы используете i
двумя различными способами:
- В index список (
r[i]
) - И в качестве переменной итерациив понимании списка
[i for i in items]
r[i]
обычно завершается ошибкой, если i
не является целым числом - списки могут быть проиндексированы только через целые числа.Тем не менее, логические значения являются особым случаем в Python, bool
на самом деле является подклассом int
:
>>> issubclass(bool, int)
True
>>> isinstance(True, int)
True
Именно поэтому это даже «работает» и дает вам удивительные результаты.
Поскольку нет необходимости использовать индексирование списков при понимании списков, это то, что вы, вероятно, хотели написать:
>>> print([i for i in r if str(i) == "True"])
[True, True]
Также обратите внимание, что неявное приведение происходитздесь, в отличие от других ранее предложенных ответов:
Python этого не делает. не"переводит r [i] в r [int (i)]".
Давайте посмотрим на строку "1"
.Он с радостью применит это значение к int
, если вы попросите:
>>> int("1")
1
Но, тем не менее, использование "1"
для индексации списка никогда не сработает:
>>> lst = ['a', 'b', 'c']
>>> lst["1"]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: list indices must be integers, not str
Ваш примертолько «работает», потому что bool
на самом деле является подклассом int
, а True
, следовательно, действительно является целым числом, насколько это касается Python.