Как получить индекс целого из списка, если список содержит логическое значение?

Я только начинаю с Python.

Как получить индекс целого числа 1 из списка, если список содержит логический True объект до 1 ?

 >>> lst = [True, False, 1, 3] >>> lst.index(1) 0 >>> lst.index(True) 0 >>> lst.index(0) 1 

Я думаю, что Python считает 0 как False и 1 как True в аргументе метода index . Как получить индекс целого числа 1 (т.е. 2 )?

Кроме того, что такое логика или логика для обработки булевого объекта таким образом в списке? Как из решений, я вижу, что это не так просто.

4 Solutions collect form web for “Как получить индекс целого из списка, если список содержит логическое значение?”

В документации говорится, что

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

Вы не должны хранить гетерогенные данные в списках. Реализация list.index выполняет только сравнение с использованием оператора Py_EQ ( == ). В вашем случае это сравнение возвращает истинное значение, потому что True и False имеют значения целых чисел 1 и 0 соответственно ( класс bool является подклассом int после всех).

Однако вы можете использовать выражение генератора и встроенную next функцию (чтобы получить первое значение от генератора) следующим образом:

 In [4]: next(i for i, x in enumerate(lst) if not isinstance(x, bool) and x == 1) Out[4]: 2 

Здесь мы проверяем, является ли x экземпляром bool перед сравнением x с 1.

Имейте в виду, что next может вызвать StopIteration , в этом случае может потребоваться (повторно) повысить ValueError (чтобы имитировать поведение list.index ).

Обертывание всего этого в функции:

 def index_same_type(it, val): gen = (i for i, x in enumerate(it) if type(x) is type(val) and x == val) try: return next(gen) except StopIteration: raise ValueError('{!r} is not in iterable'.format(val)) from None 

Некоторые примеры:

 In [34]: index_same_type(lst, 1) Out[34]: 2 In [35]: index_same_type(lst, True) Out[35]: 0 In [37]: index_same_type(lst, 42) ValueError: 42 is not in iterable 

Булевы – это целые числа в Python, и поэтому вы можете использовать их так же, как любое целое число:

 >>> 1 + True 2 >>> [1][False] 1 

[это не значит, что вы должны :)]

Это связано с тем, что bool является подклассом int , и почти всегда логическое поведение будет вести себя точно так же, как 0 или 1 (кроме случаев, когда оно передается в строку – вместо этого вы получите "False" и "True" ).

Вот еще одна идея, как вы можете достичь того, что хотите (однако, попытайтесь переосмыслить логику с учетом вышеизложенной информации):

 >>> class force_int(int): ... def __eq__(self, other): ... return int(self) == other and not isinstance(other, bool) ... >>> force_int(1) == True False >>> lst.index(force_int(1)) 2 

Этот код переопределяет метод int , который используется для сравнения элементов в методе index , чтобы игнорировать логические значения.

Вот очень простое наивное однострочное решение с использованием map и zip :

 >>> zip(map(type, lst), lst).index((int, 1)) 2 

Здесь мы сопоставляем тип каждого элемента и создаем новый список, зашивая типы с помощью элементов и запрашивая индекс (type, value) .

И вот общее итеративное решение, использующее ту же технику:

 >>> from itertools import imap, izip >>> def index(xs, x): ... it = (i for i, (t, e) in enumerate(izip(imap(type, xs), xs)) if (t, e) == x) ... try: ... return next(it) ... except StopIteration: ... raise ValueError(x) ... >>> index(lst, (int, 1)) 2 

Здесь мы в основном делаем то же самое, но итеративно, чтобы не стоить нам много с точки зрения эффективности памяти / пространства. Мы итератор того же выражения сверху, но вместо этого используем imap и izip и izip пользовательскую функцию индекса, которая возвращает следующее значение из итератора или повышает значение ValueError если нет совпадения.

Попытайтесь это сделать.

 for i, j in enumerate([True, False, 1, 3]): if not isinstance(j, bool) and j == 1: print i 

Вывод:

 2 
  • Инвертировать срез в python
  • Сортировка словаря по списку списков в порядке возрастания
  • Python: итерация по спискам по сравнению с элементами элементов dict
  • Сортировка элементов словаря в списке
  • Как создать словарь с ключами из списка и значения отдельных пустых списков?
  • Как отсортировать список словарей по значениям словаря в Python?
  • Все возможные перестановки набора списков в Python
  • Как превратить список в вложенный dict в Python
  •  
    Interesting Posts for Van-Lav

    unboundLocalError: локальная переменная 'arm', указанная перед назначением?

    Какова точная природа различий или сходства между random.setstate () и random.seed ()

    Изменение списка во время итерации по нему – почему бы и нет?

    Каков рекомендуемый шаблон использования scoped_session в многопоточном sqlalchemy webapp?

    Как получить номер строки индекса из исходной модели

    Как передать пароль Securley в качестве аргумента в скрипт Python над SSH?

    Flask-SQLAlchemy create_all ()

    Flask: перенаправить при передаче аргументов?

    Как применить функцию zip к n-list

    Я не могу заставить super () работать в python 2.7

    Redux: Как мне заставить Jython использовать модули Python, хранящиеся в Lib, в своем собственном файле jar при запуске в Hadoop?

    Удаление нескольких элементов списка внутри словаря

    Форматирование векторов оси python chaco

    Как повысить индексный индекс, когда индексы среза выходят за пределы диапазона?

    Модули OpenCV: solvePnP tvec и оси

    Python - лучший язык программирования в мире.