অজগর তালিকার সমস্ত উপাদানগুলিতে লজিক্যাল অপারেটর কীভাবে প্রয়োগ করবেন


90

পাইথনে আমার বুলিয়ানের একটি তালিকা রয়েছে। আমি তাদের এন্ড (বা ওআর বা না) করতে এবং ফলাফলটি পেতে চাই। নিম্নলিখিত কোডটি কাজ করে তবে খুব অজগর নয়।

def apply_and(alist):
 if len(alist) > 1:
     return alist[0] and apply_and(alist[1:])
 else:
     return alist[0]

কীভাবে এটি আরও অজগরিক করা যায় সে সম্পর্কে কোনও পরামর্শ প্রশংসিত।

উত্তর:


176

এতে andসমস্ত উপাদান জুড়ে যৌক্তিক a_list:

all(a_list)

এতে orসমস্ত উপাদান জুড়ে যৌক্তিক a_list:

any(a_list)

আপনি যদি সৃজনশীল বোধ করেন তবে আপনি এটি করতেও পারেন:

import operator
def my_all(a_list):
  return reduce(operator.and_, a_list, True)

def my_any(a_list):
  return reduce(operator.or_, a_list, False)

মনে রাখবেন যেগুলি শর্ট সার্কিটে মূল্যায়ন করা হয় না, যদিও বিল্ট-ইনগুলি হয় ;-)

আর একটি মজার উপায়:

def my_all_v2(a_list):
  return len(filter(None,a_list)) == len(a_list)

def my_any_v2(a_list):
  return len(filter(None,a_list)) > 0

এবং এখনও অন্য:

def my_all_v3(a_list):
  for i in a_list:
    if not i:
      return False
  return True

def my_any_v3(a_list):
  for i in a_list:
    if i:
      return True
  return False

এবং আমরা সারাদিন যেতে পারতাম, তবে হ্যাঁ, অজগর উপায়টি ব্যবহার করা allএবং any:-)

যাইহোক, পাইথনের পুনরাবৃত্তি নির্মূলের লেজ নেই, সুতরাং LISP কোডটি সরাসরি অনুবাদ করার চেষ্টা করবেন না ;-)


8
অপারেটর.আ্যান্ড_ বিটওয়াইজ এবং অপারেটর &, লজিকাল এবং নয়।
এন্টস আসমা

4
ভাগ্যক্রমে সত্য এবং মিথ্যা (যেমনটি ওপি চাইছিল) যথাক্রমে 1 এবং 0 তে কাস্ট করা হয়, তাই বিটওয়াইস অপারেটরগুলি যৌক্তিক হিসাবে কাজ করে ^ _ ^
ফরোর্টান

6
প্রচুর রিলান্ডান্ট সংস্করণ ব্যাখ্যা করা হয়েছে, তবে প্রকৃত সঠিক উত্তরের জন্য সিনট্যাক্স সরবরাহ করে নি।
jwg

4
আপনি যা চান তাতে দ্বিমত করুন, এটি প্রায়শই
জিজ্ঞাসিত

4
লক্ষ্য করুন reduce()রয়েছে functoolsপাইথন 3.0 থেকে
ডানকান ডাব্লু

33

অ্যান্ডিং এবং ওরিং সহজ:

>>> some_list = [True] * 100
# OR
>>> any(some_list)
True
#AND
>>> all(some_list)
True
>>> some_list[0] = False
>>> any(some_list)
True
>>> all(some_list)
False

লক্ষ করাও মোটামুটি সহজ:

>>> [not x for x in some_list]
[True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False]

অবশ্যই, আপনি কীভাবে এই ফলাফলগুলি ব্যবহার করবেন তার জন্য ডিমরগানের উপপাদ্যের কিছু আকর্ষণীয় অ্যাপ্লিকেশন প্রয়োজন হতে পারে।


4
আপনি যদি বৈকল্পিকের শর্ট সার্কিট করতে চান তবে কেবল জেনারেটর এক্সপ্রেশনগুলি ব্যবহার করুন: all(not x for x in some_list)(তবে এটি হ'ল not any(some_list)(বেশ প্রাকৃতিক অভিব্যক্তি, হাহ?))।
u0b34a0f6ae

16

হ্রাস এটি করতে পারেন:

reduce(lambda a,b: a and b, alist, True)

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


4
কমানো দূরে যাচ্ছে না, আফাইক এটি গ্লোবাল নেমস্পেসের পূর্ববর্তী অবস্থান থেকে, ফান্টুল মডিউলে স্থানান্তরিত হচ্ছে
এলি বেন্ডারস্কি

4
@ এলিবেন: ভবিষ্যত কাল থেকে পাইথন 3 নিয়ে কথা বলবেন কেন? হ্রাস এখনও আছেreduceহয় functools.reduce পাইথন 3
u0b34a0f6ae

আপনি যদি মুছে ফেলেন তবে , Trueএই উত্তরটি কেবল বুলের নন তালিকার জন্য, প্রশ্নের কোডের সমতুল্য সমান হবে।
থমাস আহলে

10

এই জাতীয় ক্রিয়াকলাপগুলির জন্য reduceপ্রতিমাটি হ'ল মডিউল functoolsথেকে নেওয়া operatorবা স্পষ্টরূপে কোড করা উপযুক্ত বাইনারি অপারেটরের সাথে (পাইথন ২ এক্স এ গ্লোবাল, পাইথন ৩ এক্স এ মডিউলে ) ব্যবহার করা । আপনার ক্ষেত্রে, এটিoperator.and_

reduce(operator.and_, [True, True, False])

4

এখানে আরও একটি সমাধান রয়েছে:

def my_and(a_list):
    return not (False in a_list)

def my_or(a_list):
    return True in a_list

সমস্ত উপাদানগুলি সত্য হলে অ্যান্ডিং সমস্ত উপাদান সত্য ফিরে আসবে, সুতরাং তালিকায় কোনও ফলস নেই। ORing অনুরূপ, তবে কোনও তালিকায় কমপক্ষে একটি সত্য মান উপস্থিত থাকলে এটি সত্য হওয়া উচিত।


0

অন্যান্য উত্তরগুলি যেমন দেখায়, এই কাজটি সম্পাদনের একাধিক উপায় রয়েছে। এখানে আরও একটি সমাধান যা স্ট্যান্ডার্ড লাইব্রেরি থেকে ফাংশন ব্যবহার করে:

from functools import partial

apply_and = all
apply_or = any
apply_not = partial(map, lambda x: not x)

if __name__ == "__main__":
    ls = [True, True, False, True, False, True]
    print "Original: ", ls
    print "and: ", apply_and(ls)
    print "or: ", apply_or(ls)
    print "not: ", apply_not(ls)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.