Qiymət üçün bir neçə dəyişənləri necə yoxlamaq olar?

Mən bir neçə dəyişənləri bir tamsayı ilə müqayisə edəcək və bir üç simvolu simvol göstərən funksiyanı etməyə çalışıram. Bunu Python'a tərcümə etmək üçün bir yol varmı? Belə deyirsiniz:

 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") 

bu siyahı qayıdacaq

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

Bu mümkündürmü?

488
27 февр. 27 fevral tarixində user1877442 tərəfindən təyin olundu 2013-02-27 15:26 '13 'da 15:26' də 2013-02-27 15:26
@ 20 cavab

Boole ifadələrinin necə işlədiyini yanlış başa düşürsünüz; onlar İngilis cümləsi kimi işləmir və burada bütün adlar üçün eyni müqayisə haqqında danışırsınız. Siz axtarırsınız:

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

xy başqa şəkildə müstəqil qiymətləndirilmişdir (əgər False olarsa 0 , əksinə True ).

Bir tuple qarşı bir mühafizə testi ilə qısaltmaq olar:

 if 1 in (x, y, z): 

ya da daha yaxşı:

 if 1 in {x, y, z}: 

daimi dəyəri üzvlük testindən istifadə etmək üçün müəyyən bir qaydada (sol operandan asılı olmayaraq, sabit bir müddət üçün).

Siz istifadə etdiyiniz zaman or python ifadənin hər tərəfini ayrı-ayrı ifadələr kimi görür. x or y == 1 ifadəsi x or y == 1 üçün ilk boolean testi hesab edilir, sonra isə səhv olarsa, çek y == 1 həyata keçirilir.

Bu, operatorun prioritetidir . Operator or sınaqdan aşağı bir prioritet var == , bu səbəbdən sonuncu qiymətləndirilmişdir.

Bununla belə, bu vəziyyət belə olmadıqda və x or y or z == 1 ifadəsi həqiqətən (x or y or z) == 1 kimi şərh olunduqda, hələ də ondan gözlənilən şeyi etməyəcəkdir.

x or y or z , "doğru" olan ilk arqumenti qiymətləndirir, məsələn, False , ədədi 0 və ya boş deyil (Python bir boolean kontekstdə saxta hesab etdiyi barədə daha ətraflı məlumat üçün boolean ifadələrinə bax).

Beləliklə, x = 2; y = 1; z = 0 x = 2; y = 1; z = 0 x = 2; y = 1; z = 0 x = 2; y = 1; z = 0 x = 2; y = 1; z = 0 x = 2; y = 1; z = 0 x = 2; y = 1; z = 0 x = 2; y = 1; z = 0 x = 2; y = 1; z = 0 , x or y or z 2 ə qədər verəcəkdir, çünki bu arqumentlərdə ilk əsl dəyərdir. Sonra y == 1 True olmasına baxmayaraq 2 == 1 False olacaq.

Bunun əksinə də eyni; bir dəyişəndə ​​birdən çox dəyərin sınanması; x == 1 or 2 or 3 eyni səbəblərlə uğursuz oldu. x == 1 or x == 2 or x == 3x == 1 or x == 2 or x == 3 istifadə edin x in {1, 2, 3} .

656
27 февр. cavab fevralın 27-də Martijn Pieters tərəfindən verilir 2013-02-27 15:27 '13 saat 15:27 2013-02-27 15:27

Probleminiz bir lüğət quruluşu ilə həll etmək daha asandır, məsələn:

border=0
 x = 0 y = 1 z = 3 d = {0: 'c', 1:'d', 2:'e', 3:'f'} mylist = [d[k] for k in [x, y, z]] 
73
12 июля '13 в 0:56 2013-07-12 00:56 cavab dansalmo 12 iyul '13 'də 0:56 2013-07-12 00:56 verilir

Əvvəlki həll: Martijn Pieters tərəfindən verildiyi kimi, doğru və ən sürətli format:

 if 1 in {x, y, z}: 

Əldə edilməyən görünməyən əsas problemlərdən biri sizin çıxış siyahınızın if ifadəsindən sonra hər bir məktubun daxil edilməsini istəyir.

Yalnız Martijn Pietersin məsləhətindən istifadə edərək, indi:

 if 0 in {x, y, z}: Mylist.append("c") elif 1 in {x, y, z}: Mylist.append("d") ... 

Problem: İlk if hesabat həqiqətə qaytarılır və növbəti elif bəyanatına getməyəcəksiniz. Beləliklə, siyahınız sadəcə qayıdır:

 ["c"] 

Python hər bir açıqlamanı oxuduğunda, ilkləri həqiqət və ya səhv olub-olmadığını ayrı-ayrılıqda ifadə etmək istərdiniz. Məsələn:

 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") ... 

Bu işləyəcək, amma "if" sözləri lüğətlərdən daha rahat istifadə etsəniz (orada gördüyüm işlərə baxın), istədiyiniz hərflərlə ədədlərə uyğun olan bir qaynaq lüğəti edilərək təmizlə və sonra "for" :

 numToLetters = {0:"c", 1:"d", 2:"e", 3:"f"} for number in numToLetters: if number in {x, y, z}: Mylist.append(numToLetters[number]) 
48
19 авг. Cavab verilir kiGuyRussell 19 av . 2015-08-19 05:34 '15 'də 5:34 ' de 2015-08-19 05:34

x or y or z == 0 yazmağın birbaşa yolu

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

Amma sən bunu sevmədiyini düşünmürəm :) Bu yol çirkindir.

Başqa bir yol (daha yaxşı):

 0 in (x, y, z) 

BTW bir çoxu belə bir şey yaza bilər

 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 
33
12 июля '13 в 0:16 2013-07-12 00:16 cavab 12 iyul 2013 - il tarixində, 0:16 2013-07-12 00:16 tarixində verilir

Əgər çox tənbəl olsanız, dəyərləri bir sıra içərisinə yerləşdirə bilərsiniz. Məsələn,

 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 

Siz həmçinin nömrələr və hərfləri bir lüğətə yaza bilərsiniz və bunu edə bilərsiniz, lakin yəqin ki, yalnız göstərişlərdən daha çox mürəkkəbdir. Bu tənbəl etmək üçün çalışırıq :)

Daha bir şey sizin

 if x or y or z == 0: 

tərtib edəcək, lakin istədiyiniz şəkildə deyil. Yalnız bir if ifadəsində bir dəyişən qoyduğunuzda (nümunə)

 if b 

proqram dəyişənin sıfır olub olmadığını yoxlayır. Yuxarıda göstərilən bəyanatı yazmanın başqa bir yolu (daha mənalı olur)

 if bool(b) 

Bool əsasən mantıksal operatoru yoxlamaq üçün əmrini yerinə yetirən bir python funksiyasıdır (əgər nə bilmirsənsə, budur, if deyişinizdə bunu etməyə çalışırsınız :))

Başqa bir tənbəl şəkildə tapdım:

 if any([x==0, y==0, z==0]) 
25
25 мая '15 в 6:53 2015-05-25 06:53 cavab ytpillai tərəfindən verilir 25 may, '15 at 6:53 2015-05-25 06:53

Bir dəyişən dəstdə bir dəyərin olmadığını yoxlamaq üçün daxili modulları itertoolsoperator istifadə edə bilərsiniz.

Məsələn:

İthalat

 from itertools import repeat from operator import contains 

Değişkenleri bildirin:

 x = 0 y = 1 z = 3 

Qiymət eşleme yaratmaq (yoxlamaq istədiyiniz qaydada):

 check_values = (0, 1, 3) 

Değişkenlerin tekrarlanmasına imkan verən itertools istifadə edin:

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

Nəhayət, iterator yaratmaq üçün map funksiyasından istifadə edin:

 checker = map(contains, check_vars, check_values) 

Sonra, dəyərləri yoxlamaq (orijinal qaydada) next() istifadə edin:

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

və s ..

Bu, lambda x: x in (variables) üstünlük verir, çünki operator daxili moduldur və lambda istifadə etməkdən daha sürətli və daha effektiv işləyir, bu da istifadəçi tərəfindən müəyyən edilmiş funksiyanı yaratmalıdır.

Başqa bir seçim siyahıdakı qeyri-sıfır (və ya saxta) dəyərini yoxlamaqdır:

 not (x and y and z) 

Bərabər:

 not all((x, y, z)) 
22
04 июня '14 в 20:09 2014-06-04 20:09 Cavab 04 iyun '14 'də saat 20:09' də GuiltyDolfin tərəfindən verilmişdir 2014-06-04 20:09

Buradakı yaxşı bir yanaşma, çünki burada sifariş etdiyiniz dəyişənləri əmr edir. {0,1,3} asılı olmayaraq {z,y,x} - {0,1,3} .

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

Belə ki, bütün həll O (n).

21
09 июня '15 в 23:46 2015-06-09 23:46 cavab 09 iyun 2013-cü il saat 11: 46-da verilir

Əgər istəsəniz, başqa ifadələrdən başqa, aşağıdakı ifadələr var:

 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) 
20
10 апр. cavab paarsa 10 apr. 2015-04-10 06:29 '15 at 6:29 'də 2015-04-10 06:29

Hesab edirəm ki, bunu daha yaxşı edəcək:

 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] 

Nəticə:

 print validate(0, 8, 9) c print validate(9, 8, 9) None print validate(9, 8, 2) e 
20
13 янв. Cavab 13 yanvarda Bhargav Boda tərəfindən verilir . 2015-01-13 15:10 '15 'də 15:10' də 2015-01-13 15:10

Buradakı bütün əla cavablar orijinal posterin xüsusi tələblərinə diqqət yetirilir və if 1 in {x,y,z} Martin xanımın təklif etdiyi if 1 in {x,y,z} həllində if 1 in {x,y,z} həlli if 1 in {x,y,z} diqqət mərkəzində olsun.
Onlar görmədikləri şey sualın daha geniş bir nəticəsidir:
Bir neçə dəyər üçün bir dəyişəni necə yoxlamaq olar?
Verilən həllər, məsələn, strings istifadə edin, əgər qismən hit üçün işləməyəcək:
"Wild" simli bir neçə dəyərdə olub olmadığını yoxlayın

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

və ya

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

bu simli çevirmək üçün ən asan yol

 >>> [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 

Lakin qeyd etmək lazımdır ki, @codeforester də qeyd edildiyi kimi, bu @codeforester sözləri bu metoddan istifadə edərək itirilmişdır:

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

3 məktub siyahıda birləşmədə mövcuddur, lakin ayrı bir söz kimi deyil. "Çürük" üçün test uğursuz olacaq, ancaq siyahının elementlərindən biri "cəhənnəmdə çürüyəcək", bu da uğursuz olar.
Nəticədə, bu üsuldan istifadə edərkən axtarış meyarlarına diqqət yetirin və bu məhdudiyyətin olduğunu unutmayın.

20
10 сент. Saxla Saxla Rolf tərəfindən verilmişdir 10 sentyabr 2016-09-10 18:44 '16 at 18:44 2016-09-10 18:44
 d = {0:'c', 1:'d', 2:'e', 3: 'f'} x, y, z = (0, 1, 3) print [v for (k,v) in d.items() if x==k or y==k or z==k] 
17
27 февр. cavab 27 fevralda Saksham Varma tərəfindən verilir . 2015-02-27 04:31 '15 'də 4:31' də 2015-02-27 04:31

Bu kod faydalı ola bilər.

 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; 
17
29 июня '15 в 10:03 2015-06-29 10:03 Cavab michael zxc858 tərəfindən 29 iyun '15 'də saat 10:03' da veriləcək

Tək xəttli həll:

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

Və ya:

 mylist = ['cdef'[i] for i in range(4) if i in (x, y, z)] 
4
05 июня '17 в 9:50 2017-06-05 09:50 Cavab Vinayak Kaniyarakkal tərəfindən 05 iyun '17' də 9:50 2017-06-05 09:50 'də verilir

Aşağıdakı üsulları sınayabilirsiniz. Bu üsula daxil etmək istədiyiniz dəyişənlərin sayını / sayını daxil etmək imkanı verəcəksiniz.

 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'] 
2
03 дек. Cavab Siddharth Satpathy tərəfindən verilir 03 Dek. 2018-12-03 08:13 '18 at 8:13 2018-12-03 08:13

Bir neçə dəyişənliyi tək bir dəyərlə test etmək üçün: if 1 in {a,b,c}:

Birdən çox dəyərləri tək dəyişənlə test etmək üçün: if a in {1, 2, 3}:

1
Cavab Md verilir . 20 сент. Alamin Mahamud 20 sentyabr 2018-09-20 05:18 '18 də 5:18 'də 2018-09-20 05:18

Sezar şifrəsini bir növ bina etdiyiniz kimi görünür.

Bu daha çox ümumiləşdirilmiş bir yanaşmadır:

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

çıxışlar

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

Kodun istənilən yan təsiri olub olmadığını bilmirsiniz, ancaq çıxışınızın sırası həmişə sıralanacaqdır.

İstəsəniz bu son xətt dəyişə bilər:

 sorted([chr(val + origo) for val in inputs]) 
1
27 авг. cavab firelynx 27 aug verilir . 2018-08-27 12:45 '18 saat 12:45 'də 2018-08-27 12:45' də

Python'taki pseudocode'nuzu temsil eden ən mnemonic yolu:

 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
06 авг. Cavab rsalmei 06 aug tərəfindən verilir . 2018-08-06 09:26 '18 'də saat 09:26' da 2018-08-06 09:26

Bu, asanlıqla edilə bilər

 for value in [var1,var2,var3]: li.append("targetValue") 
1
06 нояб. 06 noyabr Seenivasan'a cavab verdi . 2018-11-06 17:26 '18 saat 17:26 'da 2018-11-06 17:26

Lüğətdən istifadə edə bilərsiniz:

 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 
0
31 июля '18 в 19:54 2018-07-31 19:54 Cavab Rohit Gawas tərəfindən verilir 31 iyul, 18 saat 19:54 2018-07-31 19:54

Çox mürəkkəbləşməyin, yalnız ən asan yolu izləyin.

  x = 0 y = 1 z = 3 Mylist = [] if x == 0 or y==0 or z==0: Mylist.append('c') elif x == 1 or y == 1 or z==1: Mylist.append('d') elif x==2 or y==2 or z==2: Mylist.append('e') elif x==3 or y==3 or z==3: Mylist.append('f') 

Hooray!

0
16 июня '16 в 16:03 2016-06-16 16:03 Cavab Swadhikar tərəfindən verilir 16-16 iyun 16:03 2016-06-16 16:03