파이썬에서 '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'에서는 함수가 [ str와 unicode] 사이의 입력 유형 과 독립적으로 올바르게 작동합니다 .
— 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.