সেটটি ফাঁকা থাকলে বুলেটিয়ান রিটার্নিং


97

আমার ফাংশন শেষে আমার সেটটি খালি থাকলে আমি বুলিয়ান মান ফেরত দেওয়ার আরও পরিষ্কার উপায় খুঁজে পেতে সংগ্রাম করছি

আমি দুটি সেটের ছেদটি নিয়েছি, এবং ফলাফলটি খালি থাকলে ভিত্তিতে ফিরে যেতে চাই Trueবা এর Falseভিত্তিতে চাই ।

def myfunc(a,b):
    c = a.intersection(b)
    #...return boolean here

আমার প্রাথমিক চিন্তা করা ছিল

return c is not None

যাইহোক, আমার দোভাষীর মধ্যে আমি সহজেই দেখতে পাই যে বিবৃতিটি সত্য হলে ফিরে আসবে c = set([])

>>> c = set([])
>>> c is not None
True

আমি নিম্নলিখিত সমস্ত চেষ্টা করেছি:

>>> c == None
False
>>> c == False
False
>>> c is None
False

এখন আমি ডকুমেন্টেশন থেকে পড়া করেছি যে আমি শুধু ব্যবহার করতে পারেন and, orএবং notখালি সেট সঙ্গে একটি বুলিয়ান মান অনুমান করতে। এখনও অবধি, কেবলমাত্র আমি যে বিষয়টি সামনে আসতে পারি তা হ'ল সি নয় returning

>>> not not c
False
>>> not c
True

আমার মনে হচ্ছে এটি করার জন্য আরও অনেক অজস্র উপায় রয়েছে, এটি খুঁজে পেতে আমি সংগ্রাম করে যাচ্ছি। আমি প্রকৃত সেটটি যদি একটি বিবৃতিতে ফিরিয়ে দিতে চাই না কারণ আমার মানগুলির প্রয়োজন নেই, আমি কেবল জানতে চাই যে তারা ছেদ করে কিনা।


4
খালি bool(set([]))
সেটটিকে

4
যাইহোক, গুরুত্ব সহকারে ভাল কাজ প্রশ্ন, যা লক্ষণীয়।
জোনাস শোফার

@ জোনাস উইলিকি ধন্যবাদ! উত্তরের প্রশংসা করুন - জানতেন যে এই লাইনের সাথে এটি কিছু ছিল।
সিবি

এই প্রশ্নটি 5 বছর পরিণত হতে চলেছে এবং কেউই ব্যবহারের পরামর্শ দিচ্ছে না isdisjoint। আমি পুরোপুরি হতবাক।
আদিরিও

উত্তর:


70
def myfunc(a,b):
    c = a.intersection(b)
    return bool(c)

bool()অনুরূপ কিছু করবে not not, তবে আরও আদর্শিক এবং পরিষ্কার clear


7
আমার আপত্তি, bool(...)আপনি যখন জিজ্ঞাসা করছেন তখন লেখাই is_emptyঅস্পষ্ট। আমি অভিপ্রায়টি প্রকাশ করি না।
tamas.kenez

4
@ tamas.kenez আপনাকে স্বীকার করতে হবে, যদিও এটি এর চেয়ে পরিষ্কার not not)) (এফটিআর: আমি ইতিমধ্যে @gefeis উত্তরটি অগ্রাহ্য করেছি, তবে ওপি গৃহীত জিনিসটির উপর আমার কোনও প্রভাব নেই ...)
জোনাস শ্যাফার

109

অন্যান্য উত্তরের মতো অজগর নয়, তবে গণিত:

return len(c) == 0

কিছু মন্তব্য এর প্রভাব len(set)জটিলতা উপর হতে পারে সম্পর্কে আশ্চর্য হিসাবে । এটি ও (1) উত্স কোড হিসাবে দেখানো হয়েছে যা এটি কোনও চলকটির উপর নির্ভর করে যা সেটটির ব্যবহার ট্র্যাক করে।

static Py_ssize_t
set_len(PyObject *so)
{
    return ((PySetObject *)so)->used;
}

9
আমি মনে করি এটি আসলে আরও ভাল। এটি আপনার উদ্দেশ্য কী তা পরিষ্কার করে দেয়।
আরশাজী

4
আমি ভীত , খুব বড় len(c)হলেও এটি গণনা করতে হবে c, শূন্যতার জন্য যাচাই করার জন্য এটি অপ্রয়োজনীয়।
মিশেল দে পাস্কালিস

4
@ গ্লেডার আমি সাধারণভাবে ব্যবহৃত ডেটা স্ট্রাকচারের (যেমন তালিকা, সেট) সিপিথন লেনে বিশ্বাস করি ও (1) (যেমন তারা দৈর্ঘ্যের প্রতিনিধিত্ব করে ডেটাস্ট্রাক্টে একটি পরিবর্তনশীল সংরক্ষণ করে)
সিবি

4
1 +1 @CB আমি লেন (সি) এর জন্য কিছু পরীক্ষা করেছি এবং এটি অবশ্যই কিছু পরিবর্তনশীল লেনকে উপস্থাপন করছে কারণ সেট আকারের আকারের নাটকীয় ক্রম পরিবর্তন করার সময় সেখানে নগণ্য রানটাইম পার্থক্য ছিল।
dster7777

4
@ ডিস্টার 777777 আমি আমার কোডটি উভয় সংস্করণের সাথে প্রকাশ করেছি এবং এটি তুলনায় তাড়াতাড়ি দ্রুত হয়েছে set()(উইন্ডোজে অজগর 3.5.2)
মথিআসফেক

23

যদি আপনি return Trueএকটি খালি সেট করতে চান তবে আমার মনে হয় এটি করা আরও পরিষ্কার হবে:

return c == set()

যেমন " cখালি সমান set"

(বা, অন্য উপায়ের জন্য, return c != set())।

আমার মতে, এটি Falseবুলিয়ান প্রসঙ্গে যেমন খালি সেটটির পাইথনের ব্যাখ্যার উপর নির্ভর করার চেয়ে এটি আরও স্পষ্টত (যদিও কম আইডোমেটিক) ।


4
আসলে, পাইথনের ব্যাখ্যার উপর নির্ভর করা খুব গ্রহণযোগ্য অনুশীলন। যতক্ষণ না এর সীমাবদ্ধতা মাথায় রাখবে।
আগ্নেয়গিরি

17

তাহলে cগুচ্ছ তারপর আপনি পরীক্ষা করতে পারবেন কিনা তা করে খালি: return not c

যদি cখালি তারপর not cহতে হবে True

অন্যথায়, যদি cকোনও উপাদান থাকে তবে not cতা হবে False


6

যখন আপনি বলে:

c is not None

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

আপনি যদি শর্তাধীন বিবৃতিতে কোনও সেট খালি আছে কিনা তা পরীক্ষা করতে চান তবে এটি প্রসঙ্গে বুলিয়ান হিসাবে নিক্ষেপ করা হয়েছে যাতে আপনি কেবল এটি বলতে পারেন:

c = set()
if c:
   print "it has stuff in it"
else:
   print "it is empty"

তবে আপনি যদি এটি বুলিয়ানে রূপান্তর করতে চান তবে এটি আপনি সহজেই বলতে পারেন:

c = set()
c_has_stuff_in_it = bool(c)

1
"""
This function check if set is empty or not.
>>> c = set([])
>>> set_is_empty(c)
True

:param some_set: set to check if he empty or not.
:return True if empty, False otherwise.
"""
def set_is_empty(some_set):
    return some_set == set()

0

বুল (সি) এর মতো পরিষ্কার নয় তবে এটি টার্নারি ব্যবহারের একটি অজুহাত ছিল।

def myfunc(a,b):
    return True if a.intersection(b) else False

এছাড়াও একই যুক্তি দিয়ে কিছুটা ব্যবহার করে সি-কে বরাদ্দ দেওয়ার দরকার নেই যতক্ষণ না আপনি এটিকে অন্য কোনও কিছুর জন্য ব্যবহার করছেন।

def myfunc(a,b):
    return bool(a.intersection(b))

পরিশেষে, আমি ধরে নিচ্ছি যে আপনি একটি সত্য / মিথ্যা মান চান কারণ আপনি এটির সাথে কোনও ধরণের বুলিয়ান পরীক্ষা করতে চলেছেন। আমি আপনাকে কোথায় এটি প্রয়োজন তা পরীক্ষা করেই কোনও ফাংশন কল এবং সংজ্ঞার ওভারহেড এড়িয়ে চলা সুপারিশ করব।

পরিবর্তে:

if (myfunc(a,b)):
    # Do something

হয়তো এই:

if a.intersection(b):
    # Do something
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.