มีวิธีแปลงtrue
type unicode
เป็น 1 และfalse
type unicode
เป็น 0 (ใน Python) หรือไม่?
ตัวอย่างเช่น: x == 'true' and type(x) == unicode
ฉันต้องการ x = 1
PS: ฉันไม่ต้องการใช้if
- else
.
มีวิธีแปลงtrue
type unicode
เป็น 1 และfalse
type unicode
เป็น 0 (ใน Python) หรือไม่?
ตัวอย่างเช่น: x == 'true' and type(x) == unicode
ฉันต้องการ x = 1
PS: ฉันไม่ต้องการใช้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'
เปรียบเทียบคำถามที่ฉันตอบที่นี่เป็นค่าสตริง (unicode) เท่านั้น
ถ้าB
เป็นอาร์เรย์บูลีนให้เขียน
B = B*1
(รหัสบิตเป็นกอล์ฟ)
numpy.multiply(B,1)
ผลงาน.
B=map(int,B)
กลับส่งผลตามแผนที่ใน python 3 สำหรับฉัน
คุณสามารถใช้อาร์เรย์บูลีนของคุณอยู่x.astype('uint8')
ที่ไหนx
นี่เป็นอีกวิธีแก้ปัญหาของคุณ:
def to_bool(s):
return 1 - sum(map(ord, s)) % 2
# return 1 - sum(s.encode('ascii')) % 2 # Alternative for Python 3
มันทำงานได้เพราะผลรวมของรหัส ASCII ของ'true'
มีที่448
ซึ่งเป็นแม้กระทั่งในขณะที่ผลรวมของรหัส ASCII ของ'false'
มีที่523
ซึ่งเป็นเลขคี่
สิ่งที่ตลกเกี่ยวกับการแก้ปัญหานี้คือการที่ผลของมันเป็นแบบสุ่มสวยถ้าใส่เป็นไม่ได้อย่างใดอย่างหนึ่งหรือ'true'
'false'
ครึ่งหนึ่งของเวลาที่มันจะกลับมาและอีกครึ่งหนึ่ง0
1
ตัวแปรที่ใช้encode
จะเพิ่มข้อผิดพลาดในการเข้ารหัสหากอินพุตไม่ใช่ ASCII (จึงเป็นการเพิ่มพฤติกรรมที่ไม่ได้กำหนด)
อย่างจริงจังฉันเชื่อว่าวิธีแก้ปัญหาที่อ่านง่ายและเร็วที่สุดคือการใช้if
:
def to_bool(s):
return 1 if s == 'true' else 0
ดู microbenchmarks:
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 เท่าครั้งได้เร็วขึ้นกว่าทุกโซลูชั่นอื่น ๆ มันไม่สมเหตุสมผลที่จะวางเป็นข้อกำหนดในการหลีกเลี่ยงการใช้if
s ยกเว้นว่านี่เป็นการบ้านบางอย่าง (ซึ่งในกรณีนี้คุณไม่ควรถามสิ่งนี้ตั้งแต่แรก)
หากคุณต้องการการแปลงวัตถุประสงค์ทั่วไปจากสตริงซึ่งต่อ se ไม่ใช่บูลคุณควรเขียนกิจวัตรที่คล้ายกับที่แสดงด้านล่าง เพื่อให้สอดคล้องกับจิตวิญญาณของการพิมพ์เป็ดฉันไม่ได้ส่งผ่านข้อผิดพลาดอย่างเงียบ ๆ แต่แปลงตามความเหมาะสมสำหรับสถานการณ์ปัจจุบัน
>>> 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
? หากสตริงไม่มี'true'
หรือ'false'
มีข้อผิดพลาดค่า ถ้าใส่ไม่เป็นสตริงคุณจะได้รับ (99.99% ของครั้ง) ความAttributeError
แทนเพราะฉะนั้นมันไม่มีประโยชน์ที่จะจับและอีกยกเป็นValueError
TypeError
index
AttributeError ได้ไหม?
return ['false', 'true'].index(s) except (ValueError, AttributeError)
ผมคิดว่าผมค่อนข้างหมายถึงการโพสต์ของคุณด้านล่าง:
lower()
โทรออกเนื่องจากนี่เป็นทางออกเดียวที่ทำการคำนวณพิเศษนี้และการรวมไว้ในมาตรฐานไมโครจะไม่ถูกต้อง แน่นอนว่าแม้try...except
จะใช้เวลาสักหน่อย แต่ความแตกต่างนั้นเล็กน้อยหากไม่มีการเพิ่มข้อยกเว้น (เช่น20ns
น้อยกว่าหรือมากกว่านั้น)
บูลเป็น int:
x = (x == 'true') + 0
ตอนนี้ x มี 1 ถ้าx == 'true'
อื่น 0
หมายเหตุ: x == 'true'
จะส่งคืนบูลซึ่งจะถูกพิมพ์เป็น int ที่มีค่า (1 ถ้าค่าบูลเป็น True else 0) เมื่อบวกด้วย 0
ด้วยสิ่งนี้เท่านั้น:
const a = จริง; const b = เท็จ;
console.log (+ a); // 1 console.log (+ b); // 0