পাইথনের বুলিয়ানের বিপরীত (প্রত্যাখ্যান) কীভাবে পাব?


106

নিম্নলিখিত নমুনার জন্য:

def fuctionName(int, bool):
    if int in range(...):
        if bool == True:
            return False
        else:
            return True

দ্বিতীয়-ইফ-স্টেটমেন্ট এড়িয়ে যাওয়ার কোনও উপায় আছে কি? শুধু কম্পিউটারকে বলার জন্য উল্টো উল্টে ফিরতে বলুন bool?


6
এটি সম্ভবত শুধু pseudocode হয়, কিন্তু intboolউভয় builtin নাম (ধরনের তারা প্রতিনিধিত্ব জন্য), এবং পরিবর্তনশীল নামের হিসেবে ব্যবহার করা উচিত নয়।
সিঙ্গেলাইজেশন ইলিমিনেশন

হ্যাঁ, এটি কেবলমাত্র একটি ছদ্ম কোড, বিক্ষোভের উদ্দেশ্য ...
amyassin

7
if x == True:লেখা উচিত if x:
মাইক গ্রাহাম

উত্তর:


181

আপনি কেবল ব্যবহার করতে পারেন:

return not bool

4
এছাড়াও, int in range (....)অদক্ষ। এটি একটি তালিকা তৈরি করবে এবং তারপরে একটি লিনিয়ার অনুসন্ধান করবে। চেয়ে x in range(low, high)ভাল low <= x < high
এমআরএবি

নোট যে not Noneমিথ্যা ফিরে আসবে। কমপক্ষে আমার কাছে এটাই প্রত্যাশা ছিল না। আমি আশা করতে চাই not Noneহতে Noneতাই notএমনকি যদি ফেরত মান হতে পারে অস্বীকার ব্যবহার করা যেতে পারে None। পাইথনে এটি যেভাবে প্রয়োগ করা হয়েছে আপনাকে প্রথমে আপনাকে একটি বুলিয়ান পেয়েছে তা যাচাই করতে হবে।
ওমনি

54

notঅপারেটর (লজিক্যাল অস্বীকৃতি)

সম্ভবত সবচেয়ে ভাল উপায় অপারেটর ব্যবহার করা হয় not:

>>> value = True
>>> not value
False

>>> value = False
>>> not value
True

সুতরাং আপনার কোডের পরিবর্তে:

if bool == True:
    return False
else:
    return True

আপনি ব্যবহার করতে পারেন:

return not bool

ফাংশন হিসাবে যৌক্তিক অবহেলা

operatorমডিউলটিতে দুটি ফাংশন রয়েছে operator.not_এবং operator.__not__অপারেটরের পরিবর্তে ফাংশন হিসাবে এটির প্রয়োজন হলে এটির উপন্যাস :

>>> import operator
>>> operator.not_(False)
True
>>> operator.not_(True)
False

আপনি যদি এমন কোনও ফাংশন ব্যবহার করতে চান যা প্রিডিটিক-ফাংশন বা কলব্যাকের প্রয়োজন হয় তবে এগুলি কার্যকর হতে পারে।

উদাহরণস্বরূপ mapবা filter:

>>> lst = [True, False, True, False]
>>> list(map(operator.not_, lst))
[False, True, False, True]

>>> lst = [True, False, True, False]
>>> list(filter(operator.not_, lst))
[False, False]

একটি সমতুল্য lambdaকার্যক্রমে অবশ্যই এটি অর্জন করা যেতে পারে :

>>> my_not_function = lambda item: not item

>>> list(map(my_not_function, lst))
[False, True, False, True]

~বুলিয়ানগুলিতে বিটওয়াইস ইনভার্ট অপারেটর ব্যবহার করবেন না

বিটওয়াইস ইনভার্ট অপারেটর ~বা সমতুল্য অপারেটর ফাংশন operator.inv(বা সেখানে অন্য 3 টির মতো একটির) ব্যবহার করার জন্য একজনকে প্ররোচিত করা যেতে পারে । তবে boolফলাফলটির একটি সাবক্লাস হ'ল intঅপ্রত্যাশিত হতে পারে কারণ এটি "বিপরীত বুলিয়ান" ফিরিয়ে দেয় না, এটি "বিপরীত পূর্ণসংখ্যা" প্রদান করে:

>>> ~True
-2
>>> ~False
-1

এটি কারণ এবং এর সাথে Trueসমান এবং বিটওয়াইজ ইনভার্সনটি ইন্টিজারগুলি এবং এর বিটওয়াইজ উপস্থাপনার উপর পরিচালিত হয় ।1False0 10

সুতরাং এগুলিকে "অগ্রাহ্য" করতে ব্যবহার করা যাবে না bool

NumPy অ্যারে (এবং উপশ্রেণীর) সাথে আলোচনা

আপনি যদি বুলিয়ান সম্বলিত NumPy অ্যারেগুলি (বা উপক্লাসগুলির মতো pandas.Seriesবা pandas.DataFrame) এর সাথে লেনদেন করছেন তবে আপনি আসলে অ্যারেতে সমস্ত বুলিয়ানকে ~অগ্রাহ্য করতে বিটওয়াইস ইনভার্স অপারেটর ( ) ব্যবহার করতে পারেন :

>>> import numpy as np
>>> arr = np.array([True, False, True, False])
>>> ~arr
array([False,  True, False,  True])

বা সমতুল্য NumPy ফাংশন:

>>> np.bitwise_not(arr)
array([False,  True, False,  True])

আপনি NumPy অ্যারেগুলিতে notঅপারেটর বা operator.notফাংশনটি ব্যবহার করতে পারবেন না কারণ এগুলি প্রয়োজন যে এইগুলি একটি একক bool(বুলিয়ানগুলির একটি অ্যারে নয়) ফেরত দেয় , তবে NumPy এ একটি যৌক্তিক নয় ফাংশন রয়েছে যা উপাদান অনুসারে কাজ করে:

>>> np.logical_not(arr)
array([False,  True, False,  True])

এটি নন-বুলিয়ান অ্যারেগুলিতেও প্রয়োগ করা যেতে পারে:

>>> arr = np.array([0, 1, 2, 0])
>>> np.logical_not(arr)
array([ True, False, False,  True])

আপনার নিজস্ব ক্লাস কাস্টমাইজ করা

notboolমানটির উপর কল করে এবং ফলাফলটিকে অস্বীকার করে কাজ করে । সহজতম ক্ষেত্রে সত্যের মানটি কেবলমাত্র __bool__বস্তুকে কল করবে ।

সুতরাং প্রয়োগ করে __bool__(বা __nonzero__পাইথন 2 এ) আপনি সত্যের মানটি কাস্টমাইজ করতে পারেন এবং ফলস্বরূপ not:

class Test(object):
    def __init__(self, value):
        self._value = value

    def __bool__(self):
        print('__bool__ called on {!r}'.format(self))
        return bool(self._value)

    __nonzero__ = __bool__  # Python 2 compatibility

    def __repr__(self):
        return '{self.__class__.__name__}({self._value!r})'.format(self=self)

আমি একটি printবিবৃতি যুক্ত করেছি যাতে আপনি যাচাই করতে পারেন যে এটি সত্যই পদ্ধতিটিকে কল করে:

>>> a = Test(10)
>>> not a
__bool__ called on Test(10)
False

তেমনিভাবে আপনি __invert__প্রয়োগ করার সময় আচরণটি বাস্তবায়নের জন্য পদ্ধতিটি ~প্রয়োগ করতে পারেন:

class Test(object):
    def __init__(self, value):
        self._value = value

    def __invert__(self):
        print('__invert__ called on {!r}'.format(self))
        return not self._value

    def __repr__(self):
        return '{self.__class__.__name__}({self._value!r})'.format(self=self)

আবার একটি printকল দিয়ে দেখুন এটি দেখতে আসলে:

>>> a = Test(True)
>>> ~a
__invert__ called on Test(True)
False

>>> a = Test(False)
>>> ~a
__invert__ called on Test(False)
True

তবে এর __invert__মতো বাস্তবায়ন বিভ্রান্তিকর হতে পারে কারণ এর আচরণটি "সাধারণ" পাইথনের আচরণের থেকে পৃথক। যদি আপনি কখনই তা স্পষ্টভাবে নথিভুক্ত করেন এবং নিশ্চিত হন যে এটির বেশ ভাল (এবং সাধারণ) ব্যবহারের ক্ষেত্রে রয়েছে।


11

পাইথনের একজন "না" অপারেটর আছে, তাই না? এটা কি শুধু "নয়"? হিসাবে হিসাবে,

  return not bool

2

আপনি কেবল বুলিয়ান অ্যারের তুলনা করতে পারেন। উদাহরণ স্বরূপ

X = [True, False, True]

তারপর

Y = X == False

আপনাকে দিতে হবে

Y = [False, True, False]

4
কোনও নম্পি অ্যারের জন্য, সম্ভবত, তবে স্ট্যান্ডার্ড পাইথন তালিকার জন্য এটি ভুল। ওপিতে যেহেতু কোনওটির উল্লেখ নেই, তাই এই প্রশ্নের উত্তর কীভাবে দেয় আমি তা দেখতে ব্যর্থ হয়েছি।
সিহাহ

2

আপনি যদি কোনও টগল বাস্তবায়নের চেষ্টা করছেন , যাতে যে কোনও সময় আপনি যদি একটি ধ্রুবক কোড পুনরায় চালিত করেন তবে এটিকে উপেক্ষিত করা হচ্ছে, আপনি নিম্নলিখিত হিসাবে এটি অর্জন করতে পারেন:

try:
    toggle = not toggle
except NameError:
    toggle = True

এই কোডটি চালানো প্রথমে এতে সেট toggleহয়ে যাবে Trueএবং যে কোনও সময় এই স্নিপেটটি কল করা হবে না, টগল অবহেলিত হবে।


2

এখানে গৃহীত উত্তর প্রদত্ত দৃশ্যের জন্য সবচেয়ে সঠিক।

এটি সাধারণভাবে একটি বুলিয়ান মান উল্টানো সম্পর্কে যদিও আমাকে বিস্মিত করেছিল। এটি এখানে গৃহীত সমাধানটি একটি লাইনার হিসাবে কাজ করে, এবং আরও একটি ওয়ান-লাইনার রয়েছে যা কাজ করে। ধরে নেওয়া যাক আপনার একটি চলক "এন" রয়েছে যা আপনি জানেন যে এটি একটি বুলিয়ান, এটি উল্টানোর সহজ উপায়গুলি হ'ল:

n = n is False

যা আমার মূল সমাধান ছিল এবং তারপরে এই প্রশ্ন থেকে গৃহীত উত্তর:

n = not n

দ্বিতীয়টি আরও স্পষ্ট, তবে আমি পারফরম্যান্সের বিষয়ে অবাক হয়েছি timeitএবং এটিকে n = not nআটকাইয়াছি - এবং এটিতে দেখা গেছে বুলিয়ান মানকে উল্টানোর দ্রুততম উপায়।


n is Falseসত্য পরীক্ষার জন্য ব্যবহার করবেন না ।
জারিত

0

একই ফলাফল অর্জনের আর একটি উপায়, যা আমি পান্ডাস ডেটাফ্রেমের জন্য দরকারী বলে মনে করি।

মাউসটেল দ্বারা নীচে প্রস্তাবিত হিসাবে:

bool(1 - False)

bool(1 - True)

কেন হবে না bool(1 - False)?
মাউসটেল

ঠিক। এটি আরও ভাল এবং খাটো।
ক্যান্ডাইড

প্যাণ্ডাস ডেটাফ্রেমের কোনও লজিক্যাল ইনভারসেশন নেই, যেমন ন্যাপি অ্যারেগুলির মতো?
জন্মানো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.