अजगर में 'असत्य' को 0 और 'सत्य' को 1 में कैसे बदलें


119

क्या trueप्रकार unicodeको 1 और falseप्रकार unicodeके 0 में परिवर्तित करने का एक तरीका है (पायथन में)?

उदाहरण के लिए: x == 'true' and type(x) == unicode

मुझे चाहिए x = 1

पुनश्च: मैं उपयोग नहीं करना चाहता if- else

जवाबों:


165

int()बूलियन टेस्ट पर प्रयोग करें :

x = int(x == 'true')

int()बूलियन में बदल जाता है 1या 0। ध्यान दें कि किसी भी मूल्य के बराबर नहीं होने के 'true'परिणामस्वरूप 0वापस किया जाएगा।


यह एक अद्भुत उत्तर है, सिवाय इसके कि सब कुछ 'सच' की व्याख्या '0' के रूप में किया जाएगा। यकीन नहीं है कि अगर यह ओपी आवश्यकता के अनुरूप होगा।
अभिजीत

यद्यपि यह संभवतः ओपी चाहता था, यह प्रश्न 2.7 के लिए पूछे गए प्रश्न से बिल्कुल मेल नहीं खाता है। उन्होंने स्पष्ट रूप से इसे यूनिकोड पर काम करने के लिए कहा और टाइप के लिए व्यवहार को निर्दिष्ट नहीं किया str
विम

1
@wim वास्तव में प्रश्न में कभी भी अजगर संस्करणों का उल्लेख नहीं किया गया है, केवल इस तथ्य को बताएं कि यह अजगर 2 होना चाहिए। 7 । यह भी ध्यान दें कि python2 में u'true' == 'true'इसलिए फ़ंक्शन इनपुट प्रकार [बीच strऔर unicode] से सही ढंग से अनिश्चित व्यवहार करता है ।
बकुरीउ

लेकिन बकुरी, यह बिल्कुल मेरी बात है, "समस्या" वह है u'true' == 'true'और हमें नहीं पता कि उपयोग का मामला क्या है। शायद वे उस स्थिति के लिए एक अलग व्यवहार चाहते हैं जहां type(x) != unicode
विम

1
@AlbertChen: नहीं, क्योंकि संख्यात्मक सरणियों ने तुलनाओं का प्रसारण किया है और बूलियन मूल्य का उत्पादन नहीं किया है। इसके बजाय, तुलना बूलियन मूल्यों की एक सरणी का उत्पादन करती है। मुझे यकीन नहीं है कि आप एक arrayvalue == 'true'तुलना से क्या उम्मीद करते हैं , यहां मैंने जो प्रश्न दिया है वह एक स्ट्रिंग (यूनिकोड) मूल्य के लिए विशिष्ट है।
मार्टिन पीटर्स

136

यदि Bएक बूलियन सरणी है, तो लिखें

B = B*1

(एक बिट कोड गोल्फ।)


1
यह ठीक यही बात एकल मूल्यों के लिए भी काम करती है। यह भी खूब रही!
user31415

2
पाइथन 3 में मेरे लिए काम नहीं करता (सरणी बूलियन रहता है)। लेकिन numpy.multiply(B,1)कार्यों का उपयोग कर ।
आल्हा एम।

यह मेरे लिए अजगर 3 में काम करता है! और इस तरह के शानदार समाधान। ओह
माय

@ ऑरोबर्स: आपके सुझाव का पालन करने की कोशिश करने से मेरे लिए काम नहीं किया गया। मूल भावना के अनुसार, एक अच्छा, व्यावहारिक परिणाम B=map(int,B)ने मेरे लिए अजगर 3 में एक नक्शा obejct लौटा दिया।
Eulenfuchswiesel

1
@Eulenfuchswiesel इसका कारण यह है कि मानचित्र Python3 में एक पुनरावृत्ति देता है। इसे एक सूची के रूप में उपयोग करने के लिए, इसे एक सूची की तरह जैसे: B = सूची (मानचित्र (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'है 448, जो सम है, जबकि ASCII कोड का योग 'false'है 523जो विषम है।


इस समाधान के बारे में अजीब बात यह है कि इसके परिणाम बहुत यादृच्छिक है अगर इनपुट है नहीं में से एक 'true'या 'false'। आधा समय यह वापस आएगा 0, और दूसरा आधा 1encodeयदि इनपुट ASCII नहीं है तो वेरिएंट का उपयोग एन्कोडिंग त्रुटि उठाएगा (इस प्रकार व्यवहार की अपरिभाषित-वृद्धि)।


गंभीरता से, मेरा मानना ​​है कि सबसे पठनीय, और तेज़ , समाधान का उपयोग करना है 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.5x गुना तेज है । इसका उपयोग करने के लिए आवश्यकता के रूप में डालने से कोई मतलब नहीं है सिवाय इसके कि अगर यह किसी तरह का होमवर्क है (जिस स्थिति में आपको यह पहली बार नहीं पूछना चाहिए था)।if


7

यदि आपको एक स्ट्रिंग से एक सामान्य उद्देश्य रूपांतरण की आवश्यकता है, जो प्रति से बूल नहीं है, तो आपको नीचे दिए गए एक के समान एक नियमित रूप से लिखना चाहिए। बतख टाइपिंग की भावना को ध्यान में रखते हुए, मैंने चुपचाप त्रुटि पारित नहीं की है, लेकिन इसे वर्तमान परिदृश्य के लिए उपयुक्त रूपांतरित कर दिया है।

>>> 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? यदि स्ट्रिंग में शामिल नहीं है 'true'या 'false'यह एक मूल्य त्रुटि है। यदि इनपुट एक स्ट्रिंग नहीं है, तो आपको AttributeErrorइसके बजाय (99.99%) मिलेगा , इसलिए इसे पकड़ने ValueErrorऔर इसे फिर से बढ़ाने के लिए बेकार है TypeError
बकुरीउ

@ बकुरीउ: मैं सहमत हूं। टाइपराइटर वास्तव में यहां लागू नहीं था।
अभिजीत

@ बकुरीउ: जिज्ञासा से बाहर, क्या आप indexएक गुण को बढ़ाने का एक उदाहरण दे सकते हैं ?
georg

@ बकुरीउ: मुझे लगता है कि मैं नीचे आपकी पोस्ट का जिक्र कर रहा था return ['false', 'true'].index(s) except (ValueError, AttributeError):।
जार्ज डे

@ thg435 उस पोस्ट में मैंने सिर्फ कॉपी-पेस्ट किया और lower()कॉल को हटाने का फैसला किया क्योंकि यह एकमात्र समाधान था जिसने इस अतिरिक्त गणना को किया और इसे माइक्रो-बेंचमार्क में शामिल करना सही नहीं था। निश्चित रूप से भी try...exceptथोड़ा समय लगता है, लेकिन कोई अपवाद नहीं उठाया जाता है, तो अंतर 20nsकम होता है (जैसे कम या अधिक)।
बकुरीउ

0

बूल टू इंट: x = (x == 'true') + 0

अब x में 1 x == 'true'और 0 है।

नोट: x == 'true'बूल वापस कर देगा जो तब int वाले मान के लिए टाइपकास्ट किया जाएगा (1 यदि बूल मान सच 0 है) 0 के साथ जोड़ा जाने पर।


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.