true
유형 unicode
을 1로, false
유형 unicode
을 0 으로 변환하는 방법이 있습니까 (Python에서)?
예를 들면 : x == 'true' and type(x) == unicode
내가 원하는 x = 1
추신 : 사용하고 싶지 않습니다 if
- else
.
true
유형 unicode
을 1로, false
유형 unicode
을 0 으로 변환하는 방법이 있습니까 (Python에서)?
예를 들면 : x == 'true' and type(x) == unicode
내가 원하는 x = 1
추신 : 사용하고 싶지 않습니다 if
- else
.
답변:
사용 int()
부울 테스트에 :
x = int(x == 'true')
int()
부울을 1
또는 로 바꿉니다 0
. 참고 값 것을 하지가 같음이 'true'
발생합니다 0
반환.
str
.
u'true' == 'true'
에서는 함수가 [ str
와 unicode
] 사이의 입력 유형 과 독립적으로 올바르게 작동합니다 .
u'true' == 'true'
사용 사례가 무엇인지 모른다는 것입니다. 아마도 그들은 type(x) != unicode
.
arrayvalue == 'true'
비교 에서 무엇을 기대하는지 잘 모르겠습니다. 여기서 답변 한 질문은 문자열 (유니 코드) 값과 관련이 있습니다.
경우 B
부울 배열, 쓰기는
B = B*1
(비트 코드 골퍼.)
numpy.multiply(B,1)
작품을 사용 합니다.
B=map(int,B)
Python 3에서지도 개체를 반환했습니다.
문제에 대한 또 다른 해결책은 다음과 같습니다.
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'
0
1
encode
진지하게, 가장 읽기 쉽고 빠른 해결책은 다음을 사용하는 것입니다 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
(이 경우 처음에 이것을 요청해서는 안 됨).
그 자체로 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
TypeError
? 는 IF 문자열을 포함하지 않는 'true'
또는 'false'
그것은 A의 값 오류입니다. 입력이 당신이 얻을 것이다 문자열 (시대의 99.99 %)이 아닌 경우는 AttributeError
대신, 따라서 그것은을위한 캐치에 쓸모 ValueError
하고 다시 인상을 TypeError
.
index
AttributeError 를 발생시키는 예를 들어 주 시겠습니까?
return ['false', 'true'].index(s) except (ValueError, AttributeError)
.
lower()
추가 계산을 수행 한 유일한 솔루션이고 마이크로 벤치 마크에 포함하는 것이 정확하지 않았기 때문에 호출 을 제거하기로 결정했습니다 . 물론 try...except
약간의 시간이 소요되지만 예외가 발생하지 않으면 차이가 작습니다 ( 20ns
적은 정도).
이것으로 만 :
const a = 참; const b = 거짓;
console.log (+ a); // 1 console.log (+ b); // 0