Перейти к содержимому

Как заменить true и false на 1 и 0 питон

  • автор:

Как заменить true и false на 1 и 0 питон

Все ранее рассматриваемые программы имели линейную структуру: все инструкции выполнялись последовательно одна за одной, каждая записанная инструкция обязательно выполняется.

Допустим мы хотим по данному числу x определить его абсолютную величину (модуль). Программа должна напечатать значение переменной x, если x>0 или же величину -x в противном случае. Линейная структура программы нарушается: в зависимости от справедливости условия x>0 должна быть выведена одна или другая величина. Соответствующий фрагмент программы на Питоне имеет вид:

x = int(input()) if x > 0: print(x) else: print(-x)

В этой программе используется условная инструкция if (если). После слова if указывается проверяемое условие (x > 0) , завершающееся двоеточием. После этого идет блок (последовательность) инструкций, который будет выполнен, если условие истинно, в нашем примере это вывод на экран величины x . Затем идет слово else (иначе), также завершающееся двоеточием, и блок инструкций, который будет выполнен, если проверяемое условие неверно, в данном случае будет выведено значение -x .

Итак, условная инструкция в Питоне имеет следующий синтаксис:

if Условие: Блок инструкций 1 else: Блок инструкций 2 

Блок инструкций 1 будет выполнен, если Условие истинно. Если Условие ложно, будет выполнен Блок инструкций 2 .

В условной инструкции может отсутствовать слово else и последующий блок. Такая инструкция называется неполным ветвлением. Например, если дано число x и мы хотим заменить его на абсолютную величину x , то это можно сделать следующим образом:

x = int(input()) if x < 0: x = -x print(x)

В этом примере переменной x будет присвоено значение -x , но только в том случае, когда x

Для выделения блока инструкций, относящихся к инструкции if или else в языке Питон используются отступы. Все инструкции, которые относятся к одному блоку, должны иметь равную величину отступа, то есть одинаковое число пробелов в начале строки. Рекомендуется использовать отступ в 4 пробела и не рекомедуется использовать в качестве отступа символ табуляции.

Это одно из существенных отличий синтаксиса Питона от синтаксиса большинства языков, в которых блоки выделяются специальными словами, например, нц. кц в Кумире, begin. end в Паскале или фигурными скобками в Си.

2. Вложенные условные инструкции

Внутри условных инструкций можно использовать любые инструкции языка Питон, в том числе и условную инструкцию. Получаем вложенное ветвление – после одной развилки в ходе исполнения программы появляется другая развилка. При этом вложенные блоки имеют больший размер отступа (например, 8 пробелов). Покажем это на примере программы, которая по данным ненулевым числам x и y определяет, в какой из четвертей координатной плоскости находится точка (x,y):

x = int(input()) y = int(input()) if x > 0: if y > 0: # x > 0, y > 0 print("Первая четверть") else: # x > 0, y < 0 print("Четвертая четверть") else: if y >0: # x < 0, y >0 print("Вторая четверть") else: # x < 0, y < 0 print("Третья четверть")

В этом примере мы использовали комментарии – текст, который интерпретатор игнорирует. Комментариями в Питоне является символ # и весь текст после этого символа до конца строки.

3. Операторы сравнения

Как правило, в качестве проверяемого условия используется результат вычисления одного из следующих операторов сравнения: < Меньше — условие верно, если первый операнд меньше второго.
> Больше — условие верно, если первый операнд больше второго.
>= Больше или равно.
== Равенство. Условие верно, если два операнда равны.
!= Неравенство. Условие верно, если два операнда неравны.

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

4. Тип данных bool

Операторы сравнения возвращают значения специального логического типа bool . Значения логического типа могут принимать одно из двух значений: True (истина) или False (ложь). Если преобразовать логическое True к типу int , то получится 1, а преобразование False даст 0. При обратном преобразовании число 0 преобразуется в False , а любое ненулевое число в True . При преобразовании str в bool пустая строка преобразовывается в False , а любая непустая строка в True .

4.1. Логические операторы

Иногда нужно проверить одновременно не одно, а несколько условий. Например, проверить, является ли данное число четным можно при помощи условия (n % 2 == 0) (остаток от деления n на 2 равен 0 ), а если необходимо проверить, что два данных целых числа n и m являются четными, необходимо проверить справедливость обоих условий: n % 2 == 0 и m % 2 == 0 , для чего их необходимо объединить при помощи оператора and (логическое И): n % 2 == 0 and m % 2 == 0 .

В Питоне существуют стандартные логические операторы: логическое И, логическое ИЛИ, логическое отрицание.

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

является бинарным оператором и возвращает True тогда и только тогда, когда хотя бы один операнд равен True . Оператор “логическое ИЛИ” имеет вид or .

(отрицание) является унарным (то есть с одним операндом) оператором и имеет вид not , за которым следует единственный операнд. Логическое НЕ возвращает True , если операнд равен False и наоборот.

Пример. Проверим, что хотя бы одно из чисел a или b оканчивается на 0:

15 40
a = int(input()) b = int(input()) if a % 10 == 0 or b % 10 == 0: print('YES') else: print('NO')

Проверим, что число a — положительное, а b — неотрицательное:

if a > 0 and not (b < 0):

Или можно вместо not (b < 0) записать (b >= 0) .

Как преобразовать логические значения в целые значения в Pandas

Вы можете использовать следующий базовый синтаксис для преобразования столбца логических значений в столбец целочисленных значений в pandas:

df.column1 = df.column1.replace(< True : 1 , False : 0 >) 

В следующем примере показано, как использовать этот синтаксис на практике.

Пример: преобразование логического значения в целое в Pandas

Предположим, у нас есть следующие Pandas DataFrame:

import pandas as pd #create DataFrame df = pd.DataFrame() #view DataFrame df 

Мы можем использовать dtypes для быстрой проверки типа данных каждого столбца:

#check data type of each column df.dtypes team object points int64 playoffs bool dtype: object 

Мы видим, что столбец playoffs имеет тип boolean .

Мы можем использовать следующий код, чтобы быстро преобразовать значения True/False в столбце «плей-офф» в целочисленные значения 1/0:

#convert 'playoffs' column to integer df.playoffs = df.playoffs.replace(< True : 1 , False : 0 >) #view updated DataFrame df team points playoffs 0 A 18 1 1 B 22 0 2 C 19 0 3 D 14 0 4 E 14 1 5 F 11 0 6 G 20 1 

Каждое значение True было преобразовано в 1 , а каждое значение False было преобразовано в 0 .

Мы можем снова использовать dtypes, чтобы убедиться, что столбец «плей-офф» теперь является целым числом:

#check data type of each column df.dtypes team object points int64 playoffs int64 dtype: object 

Мы видим, что столбец play-off теперь имеет тип int64 .

Дополнительные ресурсы

В следующих руководствах объясняется, как выполнять другие распространенные операции в pandas:

Как преобразовать логические False, True в 1, 0?

Есть ли функция для преобразования булевых значений в числовые? Только мне нужно, чтобы False -> 1 , а True -> 0 .
В принципе можно и replace использовать, но хочется найти более красивый способ.

Отслеживать

149k 12 12 золотых знаков 59 59 серебряных знаков 132 132 бронзовых знака

задан 31 мая 2018 в 7:09

Denis Novik Denis Novik

589 2 2 золотых знака 9 9 серебряных знаков 25 25 бронзовых знаков

В Питоне True == 1 and False == 0 и isinstance(True, int) отличие при печати (преобразовании в строку) в основном.

31 мая 2018 в 10:09

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

In [19]: df = pd.DataFrame(<'col':np.random.choice([True, False], 10)>) In [20]: df Out[20]: col 0 False 1 True 2 True 3 False 4 False 5 True 6 False 7 False 8 True 9 False 
In [22]: df['col'] = (-df['col']).astype(np.int8) In [23]: df Out[23]: col 0 1 1 0 2 0 3 1 4 1 5 0 6 1 7 1 8 0 9 1 In [24]: df.dtypes Out[24]: col int8 dtype: object 
In [27]: df['col'] = (~df['col']).astype(np.uint8) In [28]: df Out[28]: col 0 1 1 0 2 0 3 1 4 1 5 0 6 1 7 1 8 0 9 1 

Разбираемся с not в Python

Привет, Хабр. В преддверии старта курса «Python Developer. Professional» подготовили традиционный перевод полезного материала.

В этой статье из серии про синтаксический сахар в Python я займусь на первый взгляд очень простым синтаксисом, но на самом деле, чтобы разобраться в механике его работы, нужно погрузиться вглубь на несколько слоев. Мы будем говорить о not .

Определение звучит на первый взгляд очень просто:

Оператор not выдает True, если его аргумент False, и False в противоположном случае.

Достаточно просто, не так ли? Но когда вы начинаете разбираться в том, что считать «истинным» или «ложным», вы быстро понимаете, что есть приличное количество вещей, подходящих под эти определения.

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

Реализация not

Если вы посмотрите на байткод, то заметите единственный опкод, относящийся к not – это UNARY_NOT.

>>> import dis >>> def spam(): not a . >>> dis.dis(spam) 1 0 LOAD_GLOBAL 0 (a) 2 UNARY_NOT 4 POP_TOP 6 LOAD_CONST 0 (None) 8 RETURN_VALUE

Реализация UNARY_NOT по сути вызывает функцию С, которая называется PyObject_IsTrue() и возвращает обратное переданному значение: True для False, False для True.

case TARGET(UNARY_NOT): < PyObject *value = TOP(); int err = PyObject_IsTrue(value); Py_DECREF(value); if (err == 0) < Py_INCREF(Py_True); SET_TOP(Py_True); DISPATCH(); >else if (err > 0) < Py_INCREF(Py_False); SET_TOP(Py_False); DISPATCH(); >STACK_SHRINK(1); goto error; >

Определение того, что такое True

Вся хитрость нашего разбора not начинается с определения того, что такое True. Если посмотреть на реализацию PyObject_IsTrue() на языке Си, станет видно, что существует несколько возможных способов выяснить истинность объекта.

/* Test a value used as condition, e.g., in a for or if statement. Return -1 if an error occurred */ int PyObject_IsTrue(PyObject *v) < Py_ssize_t res; if (v == Py_True) return 1; if (v == Py_False) return 0; if (v == Py_None) return 0; else if (v->ob_type->tp_as_number != NULL && v->ob_type->tp_as_number->nb_bool != NULL) res = (*v->ob_type->tp_as_number->nb_bool)(v); else if (v->ob_type->tp_as_mapping != NULL && v->ob_type->tp_as_mapping->mp_length != NULL) res = (*v->ob_type->tp_as_mapping->mp_length)(v); else if (v->ob_type->tp_as_sequence != NULL && v->ob_type->tp_as_sequence->sq_length != NULL) res = (*v->ob_type->tp_as_sequence->sq_length)(v); else return 1; /* if it is negative, it should be either -1 or -2 */ return (res > 0) ? 1 : Py_SAFE_DOWNCAST(res, Py_ssize_t, int); >

Если разбираться в реализации на С, то правило выглядит так:

  1. Если True, то True
  2. Если False, то False
  3. Если None, то False
  4. То, что возвращает bool , до тех пор, пока возвращаемый объект является подклассом bool (то, что показывает вызов nb_bool )
  5. Вызов len() на объекте (то, за что отвечают вызовы mp_length и sq_length ):
    1. Если больше 0, то True
    2. В противном случае False

    Все правила 1-3 и 6 достаточно понятны, а вот правила 4 и 5 требуют углубления в детали.

    Определение специального/волшебного метода bool говорит нам, что метод используется для «реализации проверки истинности значений» и должен возвращать либо True, либо False.

    Встроенная функция len() возвращает целое число, представляющее количество элементов в контейнере. Реализация вычисления длины объекта представлена слотами sq_length (длина последовательностей) и mp_length (длина словарей/мэпов).

    Легко подумать, что к объекту можно просто обратиться и запросить его длину, но тут есть два слоя.

    Первый слой – это специальный/волшебный метод len . Как и следовало ожидать, он «должен возвращать длину объекта, целое число >= 0». Но дело в том, что «целочисленный» не означает int , а означает объект, который вы можете «преобразовать без потерь»… к «целочисленному объекту». И как же выполнить это преобразование?

    «Чтобы без потерь преобразовать численный объект в целочисленный», используется специальный/волшебный метод index . В частности, для обработки преобразования используется функция PyNumber_Index() . Эта функция слишком длинная, чтобы ее сюда вставлять, но делает она следующее:

    1. Если аргумент является экземпляром класса int , вернуть его
    2. В противном случае вызвать index на объекте
    3. Если index возвращает конкретный экземпляр класса int , вернуть его (технически возвращать подкласс не рекомендуется, но давайте оставим это в прошлом).
    4. В противном случае вернуть TypeError .

    На уровне Python это делается с помощью operator.index() . К сожалению, здесь не реализуется семантика PyNumber_Index() , поэтому на самом деле с точки зрения not и len , функция работает немного неточно. Если бы она все же была реализована, то выглядела бы так:

    Реализация PyNumber_Index() на Python:

    def index(obj: Object, /) -> int: """Losslessly convert an object to an integer object. If obj is an instance of int, return it directly. Otherwise call __index__() and require it be a direct instance of int (raising TypeError if it isn't). """ # https://github.com/python/cpython/blob/v3.8.3/Objects/abstract.c#L1260-L1302 if isinstance(obj, int): return obj length_type = builtins.type(obj) try: __index__ = _mro_getattr(length_type, "__index__") except AttributeError: msg = ( f" cannot be interpreted as an integer " "(must be either a subclass of 'int' or have an __index__() method)" ) raise TypeError(msg) index = __index__(obj) # Returning a subclass of int is deprecated in CPython. if index.__class__ is int: return index else: raise TypeError( f"the __index__() method of returned an object of " f"type , not 'int'" )

    Реализация len()

    Еще один интересный факт о реализации len() : она всегда возвращает конкретный int . Так, несмотря на то, что index() или len() могут возвращать подкласс, ее реализация на уровне С через PyLong_FromSsize_t() гарантирует, что всегда будет возвращаться конкретный экземпляр int .

    В противном случае len() будет проверять, что возвращают len() и index () , например, является ли возвращаемый объект подклассом int , больше ли значение или равно 0 и т.д. Таким образом, вы можете реализовать len() так:

    def len(obj: Object, /) -> int: """Return the number of items in a container.""" # https://github.com/python/cpython/blob/v3.8.3/Python/bltinmodule.c#L1536-L1557 # https://github.com/python/cpython/blob/v3.8.3/Objects/abstract.c#L45-L63 # https://github.com/python/cpython/blob/v3.8.3/Objects/typeobject.c#L6184-L6209 type_ = builtins.type(obj) try: __len__ = _mro_getattr(type_, "__len__") except AttributeError: raise TypeError(f"type does not have a __len__() method") length = __len__(obj) # Due to len() using PyObject_Size() (which returns Py_ssize_t), # the returned value is always a direct instance of int via # PyLong_FromSsize_t(). index = int(_index(length)) if index < 0: raise ValueError("__len__() should return >= 0") else: return index

    Реализация operator.truth()

    Во многих языках программирования при определении операции not, распространенной идиомой является превращение объекта в его сравнительное логическое значение с помощью передачи его в not дважды – через not not . Первый раз, чтобы получить инвертированное логическое значение, и второй раз, чтобы инвертировать инверсию, и получить логическое значение, которое вы хотели изначально.

    В Python нам не нужна эта идиома. Спасибо bool() (а конкретно bool.new() ), за то, что у нас есть вызов функции, который мы можем использовать для получения конкретного логического значения, а именно operator.truth() . Если вы посмотрите на этот метод, то увидите, что он использует PyObject_IsTrue() для определения логического значения объекта. Посмотрев slot_nb_bool () , вы увидите, что в конечном итоге он делает то же, что и PyObject_IsTrue() . То есть, если мы можем реализовать аналог PyObject_IsTrue() , то можем определить, какое логическое значение имеет объект.

    По старой схеме и с тем, что мы узнали только что, мы можем реализовать operator.truth() для этой логики (я предпочитаю не реализовывать bool , поскольку не хочу реализовывать все его численные функции, и не придумал хорошего способа сделать True и False с нуля, которые наследовались бы от 1 и 0 на чистом Python).

    def truth(obj: Any, /) -> bool: """Return True if the object is true, False otherwise. Analogous to calling bool(). """ if obj is True: return True elif obj is False: return False elif obj is None: return False obj_type = type(obj) try: __bool__ = debuiltins._mro_getattr(obj_type, "__bool__") except AttributeError: # Only try calling len() if it makes sense. try: __len__ = debuiltins._mro_getattr(obj_type, "__len__") except AttributeError: # If all else fails. return True else: return True if debuiltins.len(obj) > 0 else False else: boolean = __bool__(obj) if isinstance(boolean, bool): # Coerce into True or False. return truth(boolean) else: raise TypeError( f"expected a 'bool' from .__bool__(), " f"not " )

    Реализация not

    С реализованным оператором operator.truth() , реализовать operator.not_() – дело всего одной лямбды:

    lambda a, /: False if truth(a) else True

    Итоговый результат прост, но, чтобы добраться до него, нужно было проделать немало работы.

    Как обычно, код из этой статьи можно найти в моем проекте desugar.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *