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


118

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

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

내가 원하는 x = 1

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

답변:


164

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

x = int(x == 'true')

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


이것은 '진실'이 아닌 모든 것이 '0'으로 해석된다는 점을 제외하면 훌륭한 대답입니다. 그것이 OP 요구 사항에 적합한 지 확실하지 않습니다.
Abhijit

아마도 OP가 원했던 것일 수도 있지만 python 2.7에 대해 요청한 질문과 정확히 일치하지는 않습니다. 그들은 유니 코드 유형에서 작동하도록 명시 적으로 요청했으며 유형에 대한 동작을 지정하지 않았습니다 str.
WIM

1
@wim 실제로 질문 은 python2이어야한다는 사실은 말할 것도없고 python 버전을 언급 하지 않습니다 . 7 . 또한 python2 u'true' == 'true'에서는 함수가 [ strunicode] 사이의 입력 유형 과 독립적으로 올바르게 작동합니다 .
Bakuriu

하지만 Bakuriu, 그게 바로 제 요점입니다. "문제"는 그 u'true' == 'true'사용 사례가 무엇인지 모른다는 것입니다. 아마도 그들은 type(x) != unicode.
WIM

1
@AlbertChen : 아니요. numpy 배열 은 비교를 브로드 캐스트 하고 부울 값을 생성하지 않기 때문 입니다. 대신 비교 는 부울 값 의 배열 을 생성 합니다. arrayvalue == 'true'비교 에서 무엇을 기대하는지 잘 모르겠습니다. 여기서 답변 한 질문은 문자열 (유니 코드) 값과 관련이 있습니다.
Martijn Pieters

136

경우 B부울 배열, 쓰기는

B = B*1

(비트 코드 골퍼.)


1
이 똑같은 것이 단일 값에도 적용됩니다. 이것은 대단합니다!
user31415

2
Python 3에서 작동하지 않습니다 (배열이 부울로 유지됨). 그러나 numpy.multiply(B,1)작품을 사용 합니다.
Alaa M.

이것은 파이썬 3에서 나를 위해 작동합니다! 그리고 그러한 훌륭한 솔루션. 내 오
alwaysaskingquestions

@Ourobours : 귀하의 제안을 따르려고 시도하는 것은 저에게 효과가 없었습니다. 원래 sulotion은 훌륭하고 실행 가능한 결과를 제공했지만 B=map(int,B)Python 3에서지도 개체를 반환했습니다.
Eulenfuchswiesel

1
@Eulenfuchswiesel 이것은 map이 Python3에서 반복자를 반환하기 때문입니다. 목록으로 사용하려면 다음과 같이 목록으로 캐스팅합니다. B = list (map (int, B))
Gigi Bayte 2

11

부울 배열은 x.astype('uint8')어디에 사용할 수 있습니다 x.


9

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

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

공지 사항은 어떻게 if해결책은 적어도 2.5더 빠른 것보다 모든 다른 솔루션을 제공합니다. 이것이 일종의 숙제 인 경우를 제외하고는 s 사용을 피해야한다는 요구 사항으로 두는 것은 이치에 맞지 않습니다if (이 경우 처음에 이것을 요청해서는 안 됨).


7

그 자체로 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

2
TypeError? 는 IF 문자열을 포함하지 않는 'true'또는 'false'그것은 A의 오류입니다. 입력이 당신이 얻을 것이다 문자열 (시대의 99.99 %)이 아닌 경우는 AttributeError대신, 따라서 그것은을위한 캐치에 쓸모 ValueError하고 다시 인상을 TypeError.
Bakuriu

@Bakuriu : 동의합니다. TypeError는 실제로 여기에 적용되지 않았습니다.
Abhijit

@Bakuriu : 호기심에서 indexAttributeError 를 발생시키는 예를 들어 주 시겠습니까?
georg

@Bakuriu : 나는 차라리 귀하의 게시물을 아래에 언급 한 것 같습니다 return ['false', 'true'].index(s) except (ValueError, AttributeError).
georg

@ thg435 그 게시물에서 나는 복사하여 붙여넣고 이것이이 lower()추가 계산을 수행 한 유일한 솔루션이고 마이크로 벤치 마크에 포함하는 것이 정확하지 않았기 때문에 호출 을 제거하기로 결정했습니다 . 물론 try...except약간의 시간이 소요되지만 예외가 발생하지 않으면 차이가 작습니다 ( 20ns적은 정도).
Bakuriu

0

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

이제 x는 x == 'true'0이면 1을 포함 합니다.

참고 : x == 'true'bool을 반환하면 0이 추가 될 때 값이있는 int (부울 값이 True이면 1, 그렇지 않으면 0)로 형변환됩니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.