IT story

파이썬에서 'false'를 0으로, 'true'를 1로 변환하는 방법

hot-time 2020. 9. 10. 18:58
반응형

파이썬에서 'false'를 0으로, 'true'를 1로 변환하는 방법


true유형 unicode을 1로, false유형 unicode을 0 으로 변환하는 방법이 있습니까 (파이썬에서)?

예를 들면 : x == 'true' and type(x) == unicode

내가 원하는 x = 1

추신 : 사용하고 싶지 않습니다 if- else.


사용 int()부울 테스트에 :

x = int(x == 'true')

int()부울을 1또는 로 바꿉니다 0. 참고 값 것을 하지가 같음이 'true'발생합니다 0반환.


경우 B부울 배열, 쓰기는

B = B*1

(비트 코드 골퍼.)


그 자체로 bool이 아닌 문자열에서 범용 변환이 필요한 경우 아래에 설명 된 것과 유사한 루틴을 작성하는 것이 좋습니다. 덕 타이핑의 정신에 따라 나는 조용히 오류를 전달하지 않고 현재 시나리오에 맞게 변환했습니다.

>>> def str2bool(st):
try:
    return ['false', 'true'].index(st.lower())
except (ValueError, AttributeError):
    raise ValueError('no Valid Conversion Possible')


>>> str2bool('garbaze')

Traceback (most recent call last):
  File "<pyshell#106>", line 1, in <module>
    str2bool('garbaze')
  File "<pyshell#105>", line 5, in str2bool
    raise TypeError('no Valid COnversion Possible')
TypeError: no Valid Conversion Possible
>>> str2bool('false')
0
>>> str2bool('True')
1

문제에 대한 또 다른 해결책은 다음과 같습니다.

def to_bool(s):
    return 1 - sum(map(ord, s)) % 2
    # return 1 - sum(s.encode('ascii')) % 2  # Alternative for Python 3

그것은 작동하기 때문에의 ASCII 코드의 합계 'true'IS 448의 ASCII 코드의 합계 반면, 짝수, 'false'IS는 523홀수이다.


이 솔루션의 재미있는 점은 입력이 또는 중 하나 아닌 경우 결과가 매우 무작위라는 것입니다 . 절반은 반환 되고 나머지 절반 은 반환됩니다 . 사용하는 변형 은 입력이 ASCII가 아닌 경우 인코딩 오류를 발생시킵니다 (따라서 동작의 정의되지 않음이 증가 함).'true''false'01encode


진지하게, 가장 읽기 쉽고 빠른 해결책은 다음을 사용하는 것입니다 if.

def to_bool(s):
    return 1 if s == 'true' else 0

몇 가지 마이크로 벤치 마크를 참조하십시오.

In [14]: def most_readable(s):
    ...:     return 1 if s == 'true' else 0

In [15]: def int_cast(s):
    ...:     return int(s == 'true')

In [16]: def str2bool(s):
    ...:     try:
    ...:         return ['false', 'true'].index(s)
    ...:     except (ValueError, AttributeError):
    ...:         raise ValueError()

In [17]: def str2bool2(s):
    ...:     try:
    ...:         return ('false', 'true').index(s)
    ...:     except (ValueError, AttributeError):
    ...:         raise ValueError()

In [18]: def to_bool(s):
    ...:     return 1 - sum(s.encode('ascii')) % 2

In [19]: %timeit most_readable('true')
10000000 loops, best of 3: 112 ns per loop

In [20]: %timeit most_readable('false')
10000000 loops, best of 3: 109 ns per loop

In [21]: %timeit int_cast('true')
1000000 loops, best of 3: 259 ns per loop

In [22]: %timeit int_cast('false')
1000000 loops, best of 3: 262 ns per loop

In [23]: %timeit str2bool('true')
1000000 loops, best of 3: 343 ns per loop

In [24]: %timeit str2bool('false')
1000000 loops, best of 3: 325 ns per loop

In [25]: %timeit str2bool2('true')
1000000 loops, best of 3: 295 ns per loop

In [26]: %timeit str2bool2('false')
1000000 loops, best of 3: 277 ns per loop

In [27]: %timeit to_bool('true')
1000000 loops, best of 3: 607 ns per loop

In [28]: %timeit to_bool('false')
1000000 loops, best of 3: 612 ns per loop

Notice how the if solution is at least 2.5x times faster than all the other solutions. It does not make sense to put as a requirement to avoid using ifs except if this is some kind of homework (in which case you shouldn't have asked this in the first place).


You can use x.astype('uint8') where x is your Boolean array.


bool to int: x = (x == 'true') + 0

Now the x contains 1 if x == 'true' else 0.

Note: x == 'true' will return bool which then will be typecasted to int having value (1 if bool value is True else 0) when added with 0.

참고URL : https://stackoverflow.com/questions/20840803/how-to-convert-false-to-0-and-true-to-1-in-python

반응형