পাইথন সিনট্যাক্স "যদি a বা b বা c তবে সেগুলি সমস্তই নয়"


130

আমার কাছে পাইথন স্ক্রিপ্ট রয়েছে যা শূন্য বা তিনটি কমান্ড লাইন আর্গুমেন্ট গ্রহণ করতে পারে। (হয় এটি পূর্বনির্ধারিত আচরণে চলমান বা নির্দিষ্ট তিনটি মান প্রয়োজন))

এর মতো কোনও কিছুর আদর্শ বাক্য গঠন:

if a and (not b or not c) or b and (not a or not c) or c and (not b or not a):

?


4
সম্ভবত something if len (sys.argv) == 0:
এডগার অ্যার্টিওনিয়ান

6
@ অ্যাডগারআরটিউনিয়েন len(sys.argv)সর্বদা সর্বনিম্ন 1 হবে: এতে এক্সিকিউটেবল হিসাবে অন্তর্ভুক্ত রয়েছে argv[0]
রোডিরিচ

10
প্রশ্নের শিরোনাম প্রশ্নের শিরোনামের সাথে মেলে না। আপনি কি "a বা b বা c তবে সেগুলি সবগুলিই না" বা "যদি a, b, এবং c এর ঠিক একটি হয়" (আপনি যে প্রকাশটি দিয়েছিলেন তেমনটি পরীক্ষা করতে চান)?
ডগ ম্যাকক্লেইন

2
আপনি একটি + বি + সি সম্পর্কে কী বলতে পারেন?
gukoff

6
অপেক্ষা করুন, প্রশ্ন, এটি শূন্য বা তিনটি আর্গুমেন্ট নিতে পারে। আপনি কেবল if not (a and b and c)(শূন্য আরগস) বলতে পারবেন না , এবং তারপরে if a and b and c(তিনটি আরগস)?
অ্যাকলিট

উত্তর:


236

যদি আপনি একটি ন্যূনতম ফর্ম বোঝাতে চান তবে এটি দিয়ে যান:

if (not a or not b or not c) and (a or b or c):

যা আপনার প্রশ্নের শিরোনাম অনুবাদ করে।

আপডেট: অস্থিরতা এবং সুপার দ্বারা যথাযথভাবে বলা হয়েছে, আপনি ডি মরগানের আইন প্রয়োগ করতে এবং সমতুল্য পেতে পারেন:

if (a or b or c) and not (a and b and c):

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


3
সমস্ত দুর্দান্ত উত্তর, তবে এটি সংক্ষিপ্ততার জন্য জিতবে, দুর্দান্ত শর্ট সার্কিটের সাথে। সবাইকে ধন্যবাদ!
ক্রিস উইলসন

38
আমি এটা আরও বেশি সংক্ষিপ্ত করতে এবং সঙ্গে যেতে চাইif not (a and b and c) and (a or b or c)
উদ্বায়ীতামূলক

208
বা এমনকি if (a or b or c) and not (a and b and c)শিরোনামের সাথে পুরোপুরি মিল করতে;)

3
@ হেনিএইচ আমি বিশ্বাস করি যে প্রশ্নটি "কমপক্ষে একটি শর্ত সত্য তবে সব নয়", "শুধুমাত্র একটি শর্ত সত্য নয়" এর জন্য জিজ্ঞাসা করে।
অস্থিরতা

63
@ সুপুরif any([a,b,c]) and not all([a,b,c])
চিরদিনের জন্য

238

কেমন:

conditions = [a, b, c]
if any(conditions) and not all(conditions):
   ...

অন্যান্য রূপ:

if 1 <= sum(map(bool, conditions)) <= 2:
   ...

2
sum(conditions)ভুল হয়ে যেতে পারে যদি তাদের কোন ফেরৎ 2উদাহরণস্বরূপ, যা True
ইউরোইরো

7
সত্য যে আপনার একটি কুৎসিত প্রয়োজন হবেsum(map(bool, conditions))
জামিলাক

5
দ্রষ্টব্য যে এটি স্বল্প সংক্রমণ নয়, কারণ সমস্ত শর্ত পূর্বনির্ধারিত।
জর্জি

14
@ পলসচেল্টেমা প্রথম ফর্মটি কারও পক্ষে আরও বোধগম্য।
সেমিঃ

6
এই "যেকোন এবং সমস্ত" সবচেয়ে ভাল এবং বুলিয়ান পদ্ধতি এর clearest, শুধু একটি ARG বর্তমান ও একটি ARG হচ্ছে 'truthy' হচ্ছে তার মধ্যে গুরুত্বপূর্ণ পার্থক্য সম্পর্কে খেয়াল রাখবেন হয়
Wim

115

এই প্রশ্নের ইতিমধ্যে অনেক উচ্চ উত্সাহিত উত্তর এবং একটি স্বীকৃত উত্তর ছিল, তবে এগুলির সমস্ত এখনও বুলিয়ান সমস্যাটি প্রকাশ করার বিভিন্ন উপায়ে বিভ্রান্ত হয়েছিল এবং একটি গুরুত্বপূর্ণ বিষয়টি মিস করেছিল:

আমার কাছে পাইথন স্ক্রিপ্ট রয়েছে যা শূন্য বা তিনটি কমান্ড লাইন আর্গুমেন্ট গ্রহণ করতে পারে। (হয় এটি পূর্বনির্ধারিত আচরণে চলতে পারে বা নির্দিষ্ট তিনটি মান প্রয়োজন)

এই যুক্তিটি প্রথমে আপনার কোডের দায়িত্ব হওয়া উচিত নয় , বরং এটিargparseমডিউলদ্বারা পরিচালনা করা উচিত। কোনও বিবৃতি লিখলে জটিল লিখতে বিরক্ত করবেন না, পরিবর্তে আপনার যুক্তি পার্সারটিকে সেটআপ করতে পছন্দ করুন:

#!/usr/bin/env python
import argparse as ap
parser = ap.ArgumentParser()
parser.add_argument('--foo', nargs=3, default=['x', 'y', 'z'])
args = parser.parse_args()
print(args.foo)

এবং হ্যাঁ, এটি কোনও অবস্থানগত যুক্তি নয়, এমন বিকল্প হতে হবে , কারণ এটি সর্বোপরি .চ্ছিক


সম্পাদিত: মন্তব্যের LarsH উদ্বেগের সুরাহা করতে, নীচের কিভাবে আপনি এটা লিখতে পারে যদি আপনি নির্দিষ্ট আপনি হয় 3 বা 0 দিয়ে ইন্টারফেস চেয়েছিলেন ছিল একটি উদাহরণ অবস্থানগত args। আমি মতামত করছি যে পূর্ববর্তী ইন্টারফেসটি আরও ভাল স্টাইল, কারণ alচ্ছিক যুক্তিগুলি বিকল্প হওয়া উচিত, তবে সম্পূর্ণতার স্বার্থে এখানে একটি বিকল্প পদ্ধতি রয়েছে। usageআপনার পার্সার তৈরিকরার সময় ওভাররাইডিং কোয়ার্গ নোট করুন, কারণargparseঅন্যথায় একটি বিভ্রান্তিমূলক ব্যবহার বার্তা স্বয়ংক্রিয়ভাবে উত্পন্ন করবে!

#!/usr/bin/env python
import argparse as ap
parser = ap.ArgumentParser(usage='%(prog)s [-h] [a b c]\n')
parser.add_argument('abc', nargs='*', help='specify 3 or 0 items', default=['x', 'y', 'z'])
args = parser.parse_args()
if len(args.abc) != 3:
  parser.error('expected 3 arguments')
print(args.abc)

এখানে কয়েকটি ব্যবহারের উদাহরণ দেওয়া হল:

# default case
wim@wim-zenbook:/tmp$ ./three_or_none.py 
['x', 'y', 'z']

# explicit case
wim@wim-zenbook:/tmp$ ./three_or_none.py 1 2 3
['1', '2', '3']

# example failure mode
wim@wim-zenbook:/tmp$ ./three_or_none.py 1 2 
usage: three_or_none.py [-h] [a b c]
three_or_none.py: error: expected 3 arguments

4
হ্যাঁ, আমি ইচ্ছাকৃতভাবে যোগ। যুক্তিটি স্থিতিশীল করা সম্ভব হবে এবং ঠিক 3 বা 0 গ্রাস হয়েছে তা প্রয়োগ করা সম্ভব হবে তবে এটি ভাল সিএলআই তৈরি করতে পারে না তাই আমি এটির প্রস্তাব দিয়েছি না।
উইম

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

2
@ লার্শ ঠিক আছে, আমি একটি উদাহরণ যুক্ত করেছি যা প্রশ্নের সাথে বর্ণিত মূল ইন্টারফেসের সাথে আরও ভাল ফিট করে। উপলভ্য বৈশিষ্ট্যগুলি পূরণ করার জন্য এখন এটি সরঞ্জামটি নমন করছে ...;)
উইম

2
এটি আমি উত্তর উত্সাহিত একমাত্র উত্তর। আসল প্রশ্নের উত্তর দেওয়ার জন্য +1 ।
জোনাথন রাইনহার্ট

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

32

আমি যেতে চাই:

conds = iter([a, b, c])
if any(conds) and not any(conds):
    # okay...

আমি মনে করি এটি মোটামুটি দক্ষতার সাথে শর্ট সার্কিট করা উচিত

ব্যাখ্যা

করা হলে condsকোনো ইটারেটরে, প্রথম ব্যবহারany ইচ্ছা শর্ট সার্কিট এবং পুনরুক্তিকারীর পরবর্তী উপাদান যদি কোন আইটেম সত্য নির্দেশিত ছেড়ে; অন্যথায়, এটি পুরো তালিকাটি গ্রাস করবে এবং হবে False। পরেরটি anyবাকী আইটেমগুলি পুনরাবৃত্তযোগ্যগুলিতে নিয়ে যায় এবং এটি নিশ্চিত করে তোলে যে অন্য কোনও সত্যিকারের মান নেই ... যদি তা থাকে তবে পুরো বিবৃতিটি সত্য হতে পারে না, সুতরাং একটি অনন্য উপাদান নেই (এত সংক্ষিপ্ত সার্কিট) আবার)। শেষ anyহয় হয় প্রত্যাবর্তন Falseকরবে বা পুনরাবৃত্তিযোগ্য এবং নিঃশেষিত করবে True

দ্রষ্টব্য: শুধুমাত্র একটি একক শর্ত সেট করা থাকলে উপরের চেকগুলি


যদি আপনি এক বা একাধিক আইটেমগুলি পরীক্ষা করে দেখতে চান তবে প্রতিটি আইটেম সেট করা থাকে না তবে আপনি ব্যবহার করতে পারেন:

not all(conds) and any(conds)

5
আমি পাই না। এটি এর মতো পড়ে: যদি সত্য এবং সত্য না হয়। আমাকে বুঝতে সাহায্য করুন।
rGil

1
@ আরগিল: এটি "কিছু আপেল যদি লাল হয়, এবং কিছু কিছু না থাকে" - এর মতো লেখা রয়েছে - এটি "কিছু আপেল লাল, তবে সবগুলি নয়" বলার মতো।
জর্জি

2
এমনকি ব্যাখ্যার সাথেও আমি আচরণ বুঝতে পারি না ... [a, b, c] = [True, True, False]আপনার কোডটি "প্রিন্ট" সহ করা উচিত নয় False, যখন প্রত্যাশিত আউটপুটটি হয় True?
awesoon

6
এটি বেশ চালাক, কিন্তু: আপনি যদি না জানতেন যে আপনি কতগুলি শর্তের মুখোমুখি ছিলেন তবে আমি এই পদ্ধতিটি ব্যবহার করতাম তবে একটি নির্দিষ্ট, শর্তাধীন শর্তাবলীর জন্য তালিকা পঠনযোগ্যতা হ্রাস করার পক্ষে উপযুক্ত নয়।
ফ্লফি

4
এটি শর্ট সার্কিট নয়। তালিকাটি পাস করার আগে এটি সম্পূর্ণরূপে নির্মিত হয় iteranyএবং allআলস্যভাবে তালিকাটি গ্রাস করবে সত্য, তবে তালিকাটি ইতিমধ্যে পুরোপুরি মূল্যায়ণ করা হয়েছিল যখন আপনি সেখানে পৌঁছেছেন!
অিক্টোফায়

22

ইংরেজি বাক্য:

"যদি a বা b বা c তবে তাদের সবকটিই না"

এই যুক্তি অনুবাদ করে:

(a or b or c) and not (a and b and c)

"তবে" শব্দটি সাধারণত একটি সংমিশ্রণকে বোঝায়, অন্য কথায় "এবং"। তদ্ব্যতীত, "এই সমস্ত" শর্তের সংমিশ্রণে অনুবাদ করে: এই শর্ত, এবং সেই শর্ত এবং অন্যান্য শর্ত। "নয়" পুরো সংমিশ্রণটিকে উল্টে দেয়।

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

 not a or not b or not c  ->  not (a and b and c)

দাবি করার সময় উত্তরটি একটি "ন্যূনতম ফর্ম"।


আসলে, এই ফর্মটি ন্যূনতম। এটি প্রকাশের জন্য ন্যূনতম PoS ফর্ম
স্টেফানো সানফিলিপো

10

Trueতিনটি শর্তের মধ্যে একটি এবং শুধুমাত্র একটি হলে এটি ফিরে আসে True। সম্ভবত আপনি আপনার উদাহরণ কোডটি চেয়েছিলেন কি।

if sum(1 for x in (a,b,c) if x) == 1:

@ ডেফুজ
জামিলাক

10

কি সম্পর্কে: (অনন্য শর্ত)

if (bool(a) + bool(b) + bool(c) == 1):

লক্ষ্য করুন, আপনি যদি দুটি শর্তকেও অনুমতি দেন তবে আপনি এটি করতে পারতেন

if (bool(a) + bool(b) + bool(c) in [1,2]):

1
রেকর্ডের জন্য, প্রশ্ন দুটি শর্ত জিজ্ঞাসা করে। কমপক্ষে একটি, তবে তাদের সকলেরই নয় = সকলের মধ্যে 1 বা সকলের মধ্যে 2
মারিয়াস বালিশিস

আইএমএইচও আপনার দ্বিতীয়টির মতো বানান করা উচিত 1 <= bool(a) + bool(b) + bool(c) <= 2
মনিকা

6

পরিষ্কার হতে, আপনি কতটা প্যারামিটারগুলি লজিকাল সত্য (তারপরে আর্গুমেন্টের ক্ষেত্রে - খালি নয়) এর ভিত্তিতে আপনার সিদ্ধান্ত নিতে চান?

argsne = (1 if a else 0) + (1 if b else 0) + (1 if c else 0)

তারপরে আপনি একটি সিদ্ধান্ত নিয়েছেন:

if ( 0 < argsne < 3 ):
 doSth() 

এখন যুক্তি আরও স্পষ্ট।


5

এবং কেন শুধু তাদের গণনা করা হয় না?

import sys
a = sys.argv
if len(a) = 1 :  
    # No arguments were given, the program name count as one
elif len(a) = 4 :
    # Three arguments were given
else :
    # another amount of arguments was given

5

আপনি যদি কিছুটা ক্রিপ্টিক হয়ে থাকতে আপত্তি করেন না তবে আপনি একই সাথে রোল করতে পারেন 0 < (a + b + c) < 3যা দিয়ে ফিরে আসবেtrue যদি আপনার এক থেকে দুজনের মধ্যে সত্য বক্তব্য থাকে এবং সমস্ত মিথ্যা হয় বা কোনওটিই মিথ্যা না হয় তবে পারে।

আপনি যদি বুলগুলি মূল্যায়নের জন্য ফাংশনগুলি ব্যবহার করেন তবে এটি কেবল সহজ হয় যদি আপনি কেবল একবার ভেরিয়েবলগুলি মূল্যায়ন করেন এবং যার অর্থ আপনি ফাংশনগুলি ইনলাইন লিখতে পারেন এবং অস্থায়ীভাবে ভেরিয়েবলগুলি সংরক্ষণ করার প্রয়োজন নেই। (উদাহরণ:। 0 < ( a(x) + b(x) + c(x) ) < 3)


4

প্রশ্নটিতে বলা হয়েছে যে আপনার তিনটি যুক্তি (ক এবং খ এবং সি) অথবা তাদের কোনওটিরই প্রয়োজন নেই ((ক বা খ বা সি))

এটি দেয়:

(a এবং b এবং c) বা না (a বা b বা c)


4

যেমনটি আমি এটি বুঝতে পারি, আপনার একটি ফাংশন রয়েছে যা 3 টি আর্গুমেন্ট গ্রহণ করে, তবে এটি যদি তা না করে তবে এটি ডিফল্ট আচরণে চলবে। যেহেতু আপনি 1 বা 2 টি আর্গুমেন্ট সরবরাহ করা হয় তখন কী ঘটতে হবে তা আপনি ব্যাখ্যা করেন নি তাই আমি ধরে নেব এটি কেবল ডিফল্ট আচরণ করা উচিত। কোন ক্ষেত্রে, আমি মনে করি আপনি নীচের উত্তরগুলি খুব উপকারী পাবেন:

def method(a=None, b=None, c=None):
    if all([a, b, c]):
        # received 3 arguments
    else:
        # default behavior

তবে, আপনি যদি 1 বা 2 টি আর্গুমেন্ট আলাদাভাবে পরিচালনা করতে চান:

def method(a=None, b=None, c=None):
    args = [a, b, c]
    if all(args):
        # received 3 arguments
    elif not any(args):
        # default behavior
    else:
        # some args (raise exception?)

দ্রষ্টব্য: এটি ধরে নিয়েছে যে Falseমানগুলি এই পদ্ধতিতে পাস হবে না।


আর্গুমেন্টের সত্য মান পরীক্ষা করা কোনও যুক্তি উপস্থিত বা অনুপস্থিত কিনা তা যাচাই করা থেকে আলাদা
উইম

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

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

@ উইম প্রশ্নটি বেশ অস্পষ্ট (উদাহরণস্বরূপ শরীর শিরোনামের সাথে মেলে না)। আমি মনে করি যে প্রশ্নটি যথেষ্ট স্পষ্ট নয় যে এটির কিছু ব্যাখ্যা দেওয়ার জন্য এটি একটি বৈধ উত্তর ।
মনিকা পুনরায় ইনস্টল করুন

2

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

#!/usr/bin/env python3
from random import randint
from itertools import tee

def generate_random():
    while True:
        yield bool(randint(0,1))

def any_but_not_all2(s): # elegant
    t1, t2 = tee(s)
    return False in t1 and True in t2 # could also use "not all(...) and any(...)"

def any_but_not_all(s): # simple
    hadFalse = False
    hadTrue = False
    for i in s:
        if i:
            hadTrue = True
        else:
            hadFalse = True
        if hadTrue and hadFalse:
            return True
    return False


r1, r2 = tee(generate_random())
assert any_but_not_all(r1)
assert any_but_not_all2(r2)

assert not any_but_not_all([True, True])
assert not any_but_not_all2([True, True])

assert not any_but_not_all([])
assert not any_but_not_all2([])

assert any_but_not_all([True, False])
assert any_but_not_all2([True, False])

0

যখন দেওয়া boolহয় True, বা যখন দেওয়া boolহয় False...
তারা সব একে অপরের সমান!

সুতরাং, আমাদের কেবলমাত্র দুটি উপাদান খুঁজে বের করতে হবে যা কমপক্ষে একটি এবং কমপক্ষে একটি রয়েছে তা জানতে বিভিন্ন bools এর মূল্যায়ন করে ।
TrueFalse

আমার সংক্ষিপ্ত সমাধান:

not bool(a)==bool(b)==bool(c)

আমি এটিকে শর্ট সার্কিট হিসাবে বিশ্বাস করি, এএফআইএকের a==b==cসমতুল্য হয়a==b and b==c

আমার সাধারণ সমাধান:

def _any_but_not_all(first, iterable): #doing dirty work
    bool_first=bool(first)
    for x in iterable:
        if bool(x) is not bool_first:
            return True
    return False

def any_but_not_all(arg, *args): #takes any amount of args convertable to bool
    return _any_but_not_all(arg, args)

def v_any_but_not_all(iterable): #takes iterable or iterator
    iterator=iter(iterable)
    return _any_but_not_all(next(iterator), iterator)

আমি একাধিক পুনরাবৃত্তিযোগ্যদের সাথে ডিল করে কিছু কোডও লিখেছি, তবে আমি এটিকে এখান থেকে মুছে ফেলেছি কারণ আমি মনে করি এটি অর্থহীন। এটি এখনও এখানে উপলব্ধ ।


-2

এটি মূলত "কিছু (তবে সমস্ত নয়)" কার্যকারিতা (যখন any()এবং এর সাথে বিপরীতে থাকে)all() ফাংশন builtin)।

এটি সূচিত করে যে ফলাফলের মধ্যে Falseগুলি এবং True গুলি থাকা উচিত । অতএব, আপনি নিম্নলিখিতটি করতে পারেন:

some = lambda ii: frozenset(bool(i) for i in ii).issuperset((True, False))

# one way to test this is...
test = lambda iterable: (any(iterable) and (not all(iterable))) # see also http://stackoverflow.com/a/16522290/541412

# Some test cases...
assert(some(()) == False)       # all() is true, and any() is false
assert(some((False,)) == False) # any() is false
assert(some((True,)) == False)  # any() and all() are true

assert(some((False,False)) == False)
assert(some((True,True)) == False)
assert(some((True,False)) == True)
assert(some((False,True)) == True)

এই কোডটির একটি সুবিধা হ'ল ফলস্বরূপ (বুলিয়ানস) আইটেমগুলির মাধ্যমে আপনাকে কেবল একবার পুনরাবৃত্তি করতে হবে।

একটি অসুবিধা হ'ল এই সমস্ত সত্য-প্রকাশগুলি সর্বদা মূল্যায়ন করা হয় এবং / অপারেটরগুলির মতো সংক্ষিপ্ত-সার্কিট করা না ।orand


1
আমি মনে করি এটি অযথা জটিলতা। সরল পুরানো সেটের পরিবর্তে কেন হিমশৈলী? কেন .issupersetকেবল দৈর্ঘ্য 2 পরীক্ষা করার পরিবর্তে, boolযাই হোক না কেন সত্য ও মিথ্যা ব্যতীত অন্য কোনও কিছুই ফিরিয়ে দিতে পারে না। কেন কেবল একটি ডিএফ ব্যবহার না করে একটি ল্যাম্বডা (পড়ুন: বেনামে ফাংশন) একটি নামকে বরাদ্দ করুন?
উইম

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

@ জনাসট্রোয়েলসেন আপনি ঠিক টার্গেটে রয়েছেন! এই কারণেই আমি এটি এভাবে করেছি some এটি আমার কাছে সহজ এবং পরিষ্কার করে তোলে। আমি পাইথনকে আমার কোডিংয়ের পথে :-)- তে অভিযোজিত করি।
আব্বাফাই

তবে এটি অসীম জেনারেটরগুলিতে কাজ করবে না: পি আমার উত্তর দেখুন :) ইঙ্গিত:tee
জানুস ট্রয়লসন

@ জানুস ট্রেলসন আমি এটি উপলব্ধি :-)। আমি প্রথমে এটিকে অন্যদিকে (সেটে সত্য / মিথ্যা এবং পদ্ধতি প্যারামে পুনরাবৃত্তিযোগ্য) দিয়েছিলাম তবে বুঝতে পেরেছিলাম যে এটি অসীম জেনারেটরগুলির সাথে কাজ করবে না এবং কোনও ব্যবহারকারী বুঝতে পারে না (যেহেতু এই সত্যটি নয় (তবুও) পুনরাবৃত্তিযোগ্য সেট পদ্ধতি প্যারামগুলির জন্য ডক্সে উল্লিখিত) এবং কমপক্ষে এটির মতো এটি স্পষ্ট যে এটি অসীম পুনরাবৃত্তি গ্রহণ করবে না। আমি itertools.teeতবে সচেতন ছিলাম ) 1) আমি এমন একটি
ওয়ানলাইনার সন্ধান করছিলাম
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.