একটি মানের বিপরীতে একাধিক ভেরিয়েবল কীভাবে পরীক্ষা করবেন?


644

আমি এমন একটি ফাংশন তৈরির চেষ্টা করছি যা একাধিক ভেরিয়েবলকে একটি পূর্ণসংখ্যার সাথে তুলনা করে এবং তিনটি বর্ণের একটি স্ট্রিং আউটপুট দেয়। আমি ভাবছিলাম যে পাইথনে এটি অনুবাদ করার কোনও উপায় আছে কিনা? তাই বলে:

x = 0
y = 1
z = 3
mylist = []

if x or y or z == 0 :
    mylist.append("c")
if x or y or z == 1 :
    mylist.append("d")
if x or y or z == 2 :
    mylist.append("e")
if x or y or z == 3 : 
    mylist.append("f")

যা একটি তালিকা ফিরে আসবে:

["c", "d", "f"]

এই সম্ভব হয় ভালো কিছু?


5
1(টিপল) ব্যবহার করুন

2
আপনি যখন কোনও / সমস্ত উপায়ে any/ allফাংশন ব্যবহার করতে পারেন তার বিবৃতিগুলির একটি তালিকা মূল্যায়ন করতে চান । উদাহরণস্বরূপ: all([1, 2, 3, 4, False])প্রত্যাবর্তন হবে মিথ্যা all([True, 1, 2, 3])ফিরে আসবে সত্য any([False, 0, 0, False])ফিরে আসবে মিথ্যা any([False, 0, True, False])সত্য ফিরে আসবে
16

4
এই প্রশ্নটি একটি খুব জনপ্রিয় সদৃশ লক্ষ্য, তবে আমি মনে করি এটি সে উদ্দেশ্যেই সাব -টিটিমাল। বেশিরভাগ লোকেরা এমন কিছু করার চেষ্টা করেন if x == 0 or 1:যা অবশ্যই এর অনুরূপ if x or y == 0:তবে এটি নবাগতদের জন্য কিছুটা বিভ্রান্তিকর হতে পারে। "আমার x == 0 or 1কাজ কেন হয় না ?" এর নিছক ভলিউম দেওয়া হয়েছে ? প্রশ্নগুলি, আমি বরং এই প্রশ্নগুলিকে এই প্রশ্নের জন্য আমাদের প্রচলিত সদৃশ লক্ষ্য হিসাবে ব্যবহার করব ।
অরণ-ফে

1
যখন মত "falsey" মান তুলনা অতিরিক্ত যত্ন নিন 0, 0.0বা False। আপনি সহজেই ভুল কোড লিখতে পারেন যা "সঠিক" উত্তর দেয়।
smci

উত্তর:


850

বুলিয়ান এক্সপ্রেশনগুলি কীভাবে কাজ করে তা আপনি ভুল বুঝেছেন; তারা একটি ইংরেজি বাক্যটির মতো কাজ করে না এবং অনুমান করে যে আপনি এখানে সমস্ত নামের জন্য একই তুলনা সম্পর্কে কথা বলছেন। আপনি খুঁজছেন:

if x == 1 or y == 1 or z == 1:

xএবং yঅন্যথায় তাদের নিজস্ব মূল্যায়ন করা হয় ( Falseযদি 0, Trueঅন্যথায়)।

আপনি ছোট করে তুলতে পারেন একটি টিপলের বিরুদ্ধে একটি ধারক পরীক্ষা ব্যবহার করে :

if 1 in (x, y, z):

বা আরও ভাল এখনও:

if 1 in {x, y, z}:

অবিচ্ছিন্ন সদস্যপদ পরীক্ষার সুযোগ নিতে একটিset ব্যবহার করে ( inবাম-হাতের অপারেণ্ড যাই হোক না কেন একটি নির্দিষ্ট পরিমাণ সময় নেয়)।

আপনি যখন ব্যবহার করবেন or, অজগর অপারেটরের প্রতিটি পাশকে পৃথক অভিব্যক্তি হিসাবে দেখবে । এক্সপ্রেশনটিকে x or y == 1প্রথমে বুলিয়ান পরীক্ষা হিসাবে বিবেচনা করা হয় x, তারপরে যদি এটি মিথ্যা হয় তবে অভিব্যক্তিটি y == 1পরীক্ষা করা হয়।

এটি অপারেটরের অগ্রাধিকারের কারণে । orঅপারেটর কম প্রাধান্য রয়েছে ==, যাতে আধুনিক মূল্যায়ন করা হয়, পরীক্ষা প্রথম

যাইহোক, যদি এটি না হয় এবং অভিব্যক্তিটির পরিবর্তে পরিবর্তিত x or y or z == 1হিসাবে ব্যাখ্যা করা হয়েছিল (x or y or z) == 1, এটি এখনও আপনার দ্বারা প্রত্যাশিত যা করতে পারে না।

x or y or z'সত্যবাদী' প্রথম যুক্তির মূল্যায়ন করবে, উদাহরণস্বরূপ নয় False, সংখ্যা 0 বা খালি ( পাইথন কী বুলিয়ান প্রসঙ্গে মিথ্যা বলে বিবেচনা করে তার বিশদগুলির জন্য বুলিয়ান এক্সপ্রেশন দেখুন )।

সুতরাং মানগুলির জন্য x = 2; y = 1; z = 0, x or y or zসমাধান হবে 2, কারণ এটি আর্গুমেন্টের মধ্যে প্রথম সত্যের মতো মান। তারপর 2 == 1হবে False, যদিও y == 1হবে True

বিপরীতে একই জিনিস প্রযোজ্য; একক ভেরিয়েবলের বিপরীতে একাধিক মান পরীক্ষা করা; x == 1 or 2 or 3একই কারণে ব্যর্থ হবে। ব্যবহার করুন x == 1 or x == 2 or x == 3বা x in {1, 2, 3}


116
আমি setসংস্করণে যেতে এত তাড়াতাড়ি করব না । Tuple এর তৈরি এবং পুনরাবৃত্তি খুব সস্তা। আমার মেশিনে কমপক্ষে, টিউপলগুলি সেটগুলির চেয়ে তত দ্রুত হয় যতক্ষণ না টিউলের আকার প্রায় 4-8 টি উপাদান থাকে। আপনার যদি এর চেয়ে বেশি স্ক্যান করতে হয় তবে একটি সেট ব্যবহার করুন তবে আপনি যদি 2-4 সম্ভাবনার বাইরে কোনও আইটেম সন্ধান করছেন তবে একটি টুপল এখনও দ্রুত! আপনি যদি timeit.timeit('0 in {seq}'.format(seq=tuple(range(9, -1, -1))))
টিপলটিতে প্রথম অবস্থার

57
@ ডেকয়েস্টারম্যাপার্পিয়ালসেট্যাটটার: পাইথন ৩.৩ এবং তার উপরে, সেটটি স্থির হিসাবে সংরক্ষণ করা হয়, পুরোপুরি সৃষ্টির সময়কে বাইপাস করে, সৃষ্টির সময়কে বাদ দিয়ে। tuples করতে যেমন পাইথন এড়ানোর মেমরির মন্থন তাদের একটা বান্ডিল ক্যাশে, উপার্জন সস্তা তৈরি করতে হবে যে এখানে সেট সঙ্গে সবচেয়ে বড় পার্থক্য।
মার্টিজন পিটারস

13
টুইট করুন কেবল সদস্যতার পরীক্ষায় দেন, পূর্ণসংখ্যার সেট এবং টিপলস আদর্শ দৃশ্যের জন্য সমান দ্রুত হয়; প্রথম উপাদান মেলে। এরপরে টিপলস সেটে হেরে যায়।
মার্টিজন পিটারস

17
@ মার্তিজ্নপিটারস: setএই পরীক্ষার জন্য আক্ষরিক স্বরলিপি ব্যবহার করা কোনও সঞ্চয় নয় যদি না setআক্ষরিক বিষয়বস্তুগুলিও আক্ষরিক হয় না, তাই না? if 1 in {x, y, z}:ক্যাশে করতে পারে না set, কারণ x, yএবংz পরিবর্তিত হতে পারে, সুতরাং সমাধানের একটি তৈরি করতে হবে tupleবা setস্ক্র্যাচ থেকে নেওয়া উচিত, এবং আমি সন্দেহ করি যে সদস্যতার জন্য যাচাই করার সময় আপনি যা কিছু সঞ্চয়ী সঞ্চয় পেতে পারেন তা বৃহত্তর setসৃষ্টির সময় দ্বারা জলাবদ্ধ হয়ে যাবে ।
শ্যাডোর্যাঞ্জার

9
@ শ্যাডোএ্যাঞ্জার: হ্যাঁ, পীপহোল অপটিমাইজেশন (এটির জন্য in [...]বা এটি in {...}) কেবল তখনই কাজ করে যদি তালিকাগুলি বা সেটের বিষয়বস্তুগুলিও পরিবর্তনযোগ্য আক্ষরিক হয়।
মার্টিজন পিটারস

96

আপনার সমস্যাটিকে আরও সহজে ডিকশনারি কাঠামোর সাথে সমাধান করা যায়:

x = 0
y = 1
z = 3
d = {0: 'c', 1:'d', 2:'e', 3:'f'}
mylist = [d[k] for k in [x, y, z]]

21
বা এমনকি d = "cdef"যা বাড়েMyList = ["cdef"[k] for k in [x, y, z]]
আরগের

9
বাmap(lambda i: 'cdef'[i], [x, y, z])
ডানসালমো

3
@ এমজেএম আউটপুট ক্রম ডিক দ্বারা নির্ধারিত হয় না, এটি তালিকার ক্রম দ্বারা নির্ধারিত হয়[x, y, z]
ডানসালমো

1
তালিকা বোধগম্যতা বাদ দিয়ে আমি এখনও পুরোপুরি অভ্যস্ত নই, আমাদের বেশিরভাগেরই একই প্রতিচ্ছবি ছিল: সেই ডিকটি তৈরি করুন!
লোনওয়ান্ডারার

66

মার্তিজান পিটারস দ্বারা বর্ণিত হিসাবে সঠিক এবং দ্রুততম বিন্যাসটি হ'ল:

if 1 in {x, y, z}:

তার পরামর্শ ব্যবহার করে আপনি এখন পৃথক যদি-বিবৃতি, যাতে থাকবে যে পাইথন প্রতিটি বিবৃতি পড়তে হবে সাবেক হোক না কেন Trueবা False। যেমন:

if 0 in {x, y, z}:
    mylist.append("c")
if 1 in {x, y, z}:
    mylist.append("d")
if 2 in {x, y, z}:
    mylist.append("e")
...

এই ইচ্ছার কাজ, কিন্তু যদি আপনি অভিধান ব্যবহার আরামদায়ক (দেখুন আমি সেখানে কি), আপনি অক্ষর যদি আপনি চান একটি প্রাথমিক অভিধান ম্যাপিং সংখ্যার উপার্জন হয় তাহলে, শুধুমাত্র ব্যবহার করে এই পরিষ্কার করতে পারে একটি জন্য-লুপ:

num_to_letters = {0: "c", 1: "d", 2: "e", 3: "f"}
for number in num_to_letters:
    if number in {x, y, z}:
        mylist.append(num_to_letters[number])

45

লিখতে সরাসরি উপায় x or y or z == 0হল

if any(map((lambda value: value == 0), (x,y,z))):
    pass # write your logic.

তবে আমি মনে করি না, আপনি এটি পছন্দ করেন। :) এবং এই উপায় কুরুচিপূর্ণ।

অন্য উপায় (আরও ভাল) হ'ল:

0 in (x, y, z)

বিটিডব্লিউ প্রচুর ifগুলি এর মতো কিছু লেখা যেতে পারে

my_cases = {
    0: Mylist.append("c"),
    1: Mylist.append("d")
    # ..
}

for key in my_cases:
    if key in (x,y,z):
        my_cases[key]()
        break

8
আপনার উদাহরণে dictএকটি কী পরিবর্তে আপনি ত্রুটি কারণ ফেরত মান পাবেন .appendহয় None, এবং কলিং Noneএকটি দেয় AttributeError। যদিও আমি এই পদ্ধতির সাথে একমত, যদিও।
শেঠমোর্টন

2
কীটির পরিবর্তে ডিকটি ভুল, আপনি মাইলিস্টটি পেয়ে যাবেন [['সি', 'ডি'] আপনি যখন অভিধানটি "প্রাথমিকভাবে শুরু করবেন" এমনকি "লুপ" অংশটি মন্তব্য করেছেন
মাহমুদ এলশাহাট

1
আপনার প্রথম উদাহরণের filterচেয়ে ভাল হতে পারে map, কারণ এটি কেবলমাত্র উদাহরণগুলি ফিরে আসবে যেখানে ল্যাম্বদা সত্যকে মূল্যায়ন করে
অ্যালেক্স

1
: একটি ধী একটি ল্যামডা একটি মানচিত্র চেয়ে অনেক সহজany(v == 0 for v in (x, y, z))
wjandrea

35

আপনি যদি খুব অলস হন তবে মানগুলি একটি অ্যারের ভিতরে রাখতে পারেন। যেমন

list = []
list.append(x)
list.append(y)
list.append(z)
nums = [add numbers here]
letters = [add corresponding letters here]
for index in range(len(nums)):
    for obj in list:
        if obj == num[index]:
            MyList.append(letters[index])
            break

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

আরও একটি জিনিস, আপনার

if x or y or z == 0:

সংকলন করবে তবে এটি আপনি যেভাবে চান তেমন নয়। যখন আপনি কেবল যদি একটি বিবৃতিতে একটি পরিবর্তনশীল রাখেন (উদাহরণস্বরূপ)

if b

প্রোগ্রামটি ভেরিয়েবলটি নাল নয় কিনা তা পরীক্ষা করবে। উপরোক্ত বিবৃতিটি লেখার আরেকটি উপায় (যা আরও বেশি বোঝায়)

if bool(b)

বুল অজগরটিতে একটি অন্তর্নির্মিত ফাংশন যা মূলত একটি বুলিয়ান বিবৃতি যাচাইয়ের আদেশ দেয় (যদি আপনি এটি জানেন না তবে এটি এখনই আপনার যদি বিবৃতিতে দেওয়ার চেষ্টা করছেন তবে :))

আমি আর একটি অলস উপায় খুঁজে পেয়েছি:

if any([x==0, y==0, z==0])

3
-1 এখানে অনেক খারাপ অভ্যাস রয়েছে। listপাইথন বিল্টিন; পরিবর্তে অন্য নাম ব্যবহার করুন, xyzউদাহরণস্বরূপ। আপনি যখন চারটি ধাপে তালিকাটি তৈরি করতে পারেন যখন আপনি একটি করতে পারেন, অর্থাত্ xyz = [x, y, z]? সমান্তরাল তালিকা ব্যবহার করবেন না, পরিবর্তে ডিক ব্যবহার করুন। সব মিলিয়ে, এই সমাধানটি থটগ্যুরসেলের চেয়ে অনেক বেশি বিশৃঙ্খল । এছাড়াও শেষ অংশের জন্য, কেন একটি বোঝাপড়া করবেন না, অর্থাত্ any(v == 0 for v in (x, y, z))? এছাড়াও অ্যারে পাইথনের অন্য কিছু।
wjandrea

32

ভেরিয়েবলগুলির একটি সেটের মধ্যে কোনও মান রয়েছে কিনা তা পরীক্ষা করতে আপনি ইনবিল্ট মডিউলগুলি itertoolsএবং ব্যবহার করতে পারেন operator

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

আমদানি:

from itertools import repeat
from operator import contains

ভেরিয়েবলগুলি ঘোষণা করুন:

x = 0
y = 1
z = 3

মানগুলির ম্যাপিং তৈরি করুন (আপনি যে ক্রমটি পরীক্ষা করতে চান সেটিতে):

check_values = (0, 1, 3)

itertoolsভেরিয়েবলগুলির পুনরাবৃত্তি করার অনুমতি দেওয়ার জন্য ব্যবহার করুন :

check_vars = repeat((x, y, z))

অবশেষে, mapএকটি পুনরুক্তি তৈরি করতে ফাংশনটি ব্যবহার করুন :

checker = map(contains, check_vars, check_values)

তারপরে, মানগুলি পরীক্ষা করার সময় (মূল ক্রমে) ব্যবহার করুন next():

if next(checker)  # Checks for 0
    # Do something
    pass
elif next(checker)  # Checks for 1
    # Do something
    pass

ইত্যাদি ...

এই উপর একটি সুবিধা আছে lambda x: x in (variables)কারণ operatorএকটি Inbuilt মডিউল এবং দ্রুত এবং আরো ব্যবহার থেকেও কার্যকারীlambda একটি কাস্টম ইন-প্লেস ফাংশন তৈরি করতে হবে যা ।

তালিকায় একটি শূন্য (বা মিথ্যা) মান আছে কিনা তা পরীক্ষা করার জন্য অন্য একটি বিকল্প:

not (x and y and z)

সমতুল্য:

not all((x, y, z))

2
এটি ওপি-র প্রশ্নের উত্তর দেয় না। এটি কেবলমাত্র প্রদত্ত উদাহরণে প্রথম কেসটি কভার করে।
ওয়াল্যাকার

31

সেটটি এখানে ভাল পদ্ধতির কারণ এটি ভেরিয়েবলগুলি অর্ডার করে, এখানে আপনার লক্ষ্য বলে মনে হয়। {z,y,x}হয় {0,1,3}যাই হোক না কেন প্যারামিটার অর্ডার।

>>> ["cdef"[i] for i in {z,x,y}]
['c', 'd', 'f']

এইভাবে, পুরো সমাধানটি হ'ল (এন)।


5
আপনার কোডটি কীভাবে সম্পাদন করে এবং কীভাবে এটি ঘটে তার একটি বিবরণ যুক্ত করা উচিত। কেবল কোড ব্যবহার করে সংক্ষিপ্ত উত্তরগুলি নিরুৎসাহিত করা হয়
রানিজ

31

এখানে প্রদত্ত দুর্দান্ত উত্তরগুলির সমস্তগুলি মূল পোস্টারের নির্দিষ্ট প্রয়োজনীয়তার উপর মনোনিবেশ করে এবং if 1 in {x,y,z}মার্টিজন পিটারসের সামনে দেওয়া সমাধানটিতে মনোনিবেশ করে ।
তারা যা উপেক্ষা করে তা হ'ল প্রশ্নের বিস্তৃত প্রভাব:
আমি কীভাবে একাধিক মানের বিপরীতে পরীক্ষা করতে পারি?
প্রদত্ত সমাধানটি স্ট্রিং ব্যবহার করে আংশিক হিটগুলির জন্য কাজ করবে না উদাহরণস্বরূপ:
"ওয়াইল্ড" স্ট্রিংটি যদি একাধিক মানের হয় তবে পরীক্ষা করুন

>>> x = "Wild things"
>>> y = "throttle it back"
>>> z = "in the beginning"
>>> if "Wild" in {x, y, z}: print (True)
... 

অথবা

>>> x = "Wild things"
>>> y = "throttle it back"
>>> z = "in the beginning"
>>> if "Wild" in [x, y, z]: print (True)
... 

এই দৃশ্যের জন্য স্ট্রিংয়ে রূপান্তর করা সবচেয়ে সহজ

>>> [x, y, z]
['Wild things', 'throttle it back', 'in the beginning']
>>> {x, y, z}
{'in the beginning', 'throttle it back', 'Wild things'}
>>> 

>>> if "Wild" in str([x, y, z]): print (True)
... 
True
>>> if "Wild" in str({x, y, z}): print (True)
... 
True

এটি উল্লেখ করা উচিত, যেমন উল্লেখ করা হয়েছে @codeforester যে শব্দের সীমাগুলি এই পদ্ধতিতে হারিয়ে গেছে, যেমন:

>>> x=['Wild things', 'throttle it back', 'in the beginning']
>>> if "rot" in str(x): print(True)
... 
True

3 অক্ষর rotতালিকার সংমিশ্রণে বিদ্যমান তবে পৃথক শব্দ হিসাবে নয়। "পচা" এর জন্য পরীক্ষা করা ব্যর্থ হবে তবে তালিকার একটি আইটেম যদি "নরকে পচে" থাকে তবে তাও ব্যর্থ হবে।
আপশট হচ্ছে, এই পদ্ধতিটি ব্যবহার করা হলে আপনার অনুসন্ধানের মানদণ্ডটি সম্পর্কে সতর্ক থাকুন এবং সচেতন হন যে এটির এই সীমাবদ্ধতা রয়েছে।


30

আমি মনে করি এটি এটিকে আরও ভালভাবে পরিচালনা করবে:

my_dict = {0: "c", 1: "d", 2: "e", 3: "f"}

def validate(x, y, z):
    for ele in [x, y, z]:
        if ele in my_dict.keys():
            return my_dict[ele]

আউটপুট:

print validate(0, 8, 9)
c
print validate(9, 8, 9)
None
print validate(9, 8, 2)
e

30

আপনি যদি ব্যবহার করতে চান, অন্যথায় বিবৃতিগুলি অন্য সমাধান:

myList = []
aList = [0, 1, 3]

for l in aList:
    if l==0: myList.append('c')
    elif l==1: myList.append('d')
    elif l==2: myList.append('e')
    elif l==3: myList.append('f')

print(myList)


26

এই কোডটি সহায়ক হতে পারে

L ={x, y, z}
T= ((0,"c"),(1,"d"),(2,"e"),(3,"f"),)
List2=[]
for t in T :
if t[0] in L :
    List2.append(t[1])
    break;

12

আপনি নীচের দেখানো পদ্ধতি চেষ্টা করতে পারেন। এই পদ্ধতিতে, আপনি প্রবেশ করতে চান এমন ভেরিয়েবলের সংখ্যা নির্দিষ্ট / ইনপুট করার স্বাধীনতা পাবেন।

mydict = {0:"c", 1:"d", 2:"e", 3:"f"}
mylist= []

num_var = int(raw_input("How many variables? ")) #Enter 3 when asked for input.

for i in range(num_var): 
    ''' Enter 0 as first input, 1 as second input and 3 as third input.'''
    globals()['var'+str('i').zfill(3)] = int(raw_input("Enter an integer between 0 and 3 "))
    mylist += mydict[globals()['var'+str('i').zfill(3)]]

print mylist
>>> ['c', 'd', 'f']


9

আউটপুট বিট সেট করার জন্য আপনার সরাসরি সূত্রের প্রয়োজন হতে পারে।

x=0 or y=0 or z=0   is equivalent to x*y*z = 0

x=1 or y=1 or z=1   is equivalent to (x-1)*(y-1)*(z-1)=0

x=2 or y=2 or z=2   is equivalent to (x-2)*(y-2)*(z-2)=0

বিটগুলিতে মানচিত্র দিন: 'c':1 'd':0xb10 'e':0xb100 'f':0xb1000

ইস্কের সম্পর্ক (এটি 'সি'):

if xyz=0 then isc=1 else isc=0

সূত্র https://youtu.be/KAdKCgBGK0k?list=PLnI9xbPdZUAmUL8htSl6vToPQRRN3hhFp&t=315 যদি গণিত ব্যবহার করুন

[গ]: (xyz=0 and isc=1) or (((xyz=0 and isc=1) or (isc=0)) and (isc=0))

[ঘ]: ((x-1)(y-1)(z-1)=0 and isc=2) or (((xyz=0 and isd=2) or (isc=0)) and (isc=0))

...

নিম্নলিখিত সূত্রগুলি যুক্ত করে এই সূত্রগুলি সংযুক্ত করুন:

  • যুক্তি andহল সমীকরণের বর্গের যোগফল
  • যুক্তি orসমীকরণের পণ্য

এবং আপনার মোট সমীকরণ এক্সপ্রেস যোগ হবে এবং আপনার যোগফলের মোট সূত্র রয়েছে

তারপরে যোগফল এবং 1 সি, সমষ্টি এবং 2 হ'ল, যোগফল 4 এবং ই, সমষ্টি এবং 5 হয় চ

এর পরে আপনি পূর্বনির্ধারিত অ্যারে গঠন করতে পারেন যেখানে স্ট্রিং উপাদানগুলির সূচি প্রস্তুত স্ট্রিংয়ের সাথে মিল রাখে।

array[sum] আপনি স্ট্রিং দেয়।


7

এটি হিসাবে সহজেই করা যেতে পারে

for value in [var1,var2,var3]:
     li.append("targetValue")

6

পাইথনে আপনার সিউডো-কোড উপস্থাপনের সবচেয়ে স্মরণীয় উপায়টি হ'ল:

x = 0
y = 1
z = 3
mylist = []

if any(v == 0 for v in (x, y, z)):
    mylist.append("c")
if any(v == 1 for v in (x, y, z)):
    mylist.append("d")
if any(v == 2 for v in (x, y, z)):
    mylist.append("e")
if any(v == 3 for v in (x, y, z)):
    mylist.append("f")

1
এই পদ্ধতির চেয়ে সর্বজনীন `যদি 2 ইন (এক্স, ওয়াই, জেড): মাইলিস্ট.অ্যাপেন্ড ('ই')` কারণ স্বেচ্ছাসেবী তুলনার অনুমতি দেয় (উদাঃ if any(v >= 42 for v in (x, y, z)):)। আর 3 পদ্ধতির কর্মক্ষমতা ( 2 in {x,y,z}, 2 in (x,y,z), any(_v == 2 for _v in (x,y,z))) CPython3.6 প্রায় একই মনে করা হয় (দেখুন সারকথা )
imposeren

5

একক মান সহ একাধিক ভেরিয়েবল পরীক্ষা করতে: if 1 in {a,b,c}:

এক ভেরিয়েবলের সাথে একাধিক মান পরীক্ষা করতে: if a in {1, 2, 3}:


4

দেখে মনে হচ্ছে আপনি কোনও ধরণের সিজার সাইফার তৈরি করছেন।

আরও অনেক সাধারণীকরণ পদ্ধতি হ'ল:

input_values = (0, 1, 3)
origo = ord('c')
[chr(val + origo) for val in inputs]

আউটপুট

['c', 'd', 'f']

এটি আপনার কোডের পছন্দসই পার্শ্ব প্রতিক্রিয়া কিনা তা নিশ্চিত নয় তবে আপনার আউটপুটটির ক্রমটি সর্বদা সাজানো হবে।

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

sorted([chr(val + origo) for val in inputs])

2

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

x = 0
y = 1
z = 3
list=[]
dict = {0: 'c', 1: 'd', 2: 'e', 3: 'f'}
if x in dict:
    list.append(dict[x])
else:
    pass

if y in dict:
    list.append(dict[y])
else:
    pass
if z in dict:
    list.append(dict[z])
else:
    pass

print list

1
এটি এর পরে আরও একবার সংযুক্ত হতে পারে। সেট করতে চান?
সের্গেই

2

ডিক ছাড়া, এই সমাধানটি চেষ্টা করে দেখুন:

x, y, z = 0, 1, 3    
offset = ord('c')
[chr(i + offset) for i in (x,y,z)]

এবং দেয়:

['c', 'd', 'f']

0

এটি আপনাকে সাহায্য করবে।

def test_fun(val):
    x = 0
    y = 1
    z = 2
    myList = []
    if val in (x, y, z) and val == 0:
        myList.append("C")
    if val in (x, y, z) and val == 1:
        myList.append("D")
    if val in (x, y, z) and val == 2:
        myList.append("E")

test_fun(2);

0

আপনি এটি একত্রিত করতে পারেন

x = 0
y = 1
z = 3

একটি পরিবর্তনশীল মধ্যে।

In [1]: xyz = (0,1,3,) 
In [2]: mylist = []

আমাদের শর্তগুলি পরিবর্তন করুন:

In [3]: if 0 in xyz: 
    ...:     mylist.append("c") 
    ...: if 1 in xyz: 
    ...:     mylist.append("d") 
    ...: if 2 in xyz: 
    ...:     mylist.append("e") 
    ...: if 3 in xyz:  
    ...:     mylist.append("f") 

আউটপুট:

In [21]: mylist                                                                                
Out[21]: ['c', 'd', 'f']

0

সমস্যা

যখন একাধিক মান পরীক্ষার জন্য প্যাটার্ন

>>> 2 in {1, 2, 3}
True
>>> 5 in {1, 2, 3}
False

খুব পঠনযোগ্য এবং অনেক পরিস্থিতিতে কাজ করছে, এখানে একটি সমস্যা রয়েছে:

>>> 0 in {True, False}
True

তবে আমরা চাই

>>> (0 is True) or (0 is False)
False

সমাধান

পূর্ববর্তী অভিব্যক্তির একটি সাধারণীকরণ ytpillai এর উত্তরের ভিত্তিতে :

>>> any([0 is True, 0 is False])
False

যা হিসাবে লেখা যেতে পারে

>>> any(0 is item for item in (True, False))
False

এই অভিব্যক্তিটি সঠিক ফলাফল প্রদান করার সময় এটি প্রথম প্রকাশের মতো পাঠযোগ্য নয় :-(

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