Əgər siyahı hələ də anlaşıbsa

l :

 l = [22, 13, 45, 50, 98, 69, 43, 44, 1] 

45-dən yuxarı ədədlər üçün 1 əlavə edərdim; və daha kiçik nömrələr üçün 5.

Mən çalışdım

 [x+1 for x in l if x >= 45 else x+5] 

Ancaq mənə bir sözdizim səhvini verir. Siyahı anlayarkən bu kimi else bir else necə nail ola bilərəm?

257
10 дек. user225312 tərəfindən 10 dekabrda təyin olundu . 2010-12-10 09:45 '10 saat 09:45 'da 2010-12-10 09:45
@ 8 cavab
 >>> l = [22, 13, 45, 50, 98, 69, 43, 44, 1] >>> [x+1 if x >= 45 else x+5 for x in l] [27, 18, 46, 51, 99, 70, 48, 49, 6] 

Əgər bir şey varsa, <condition> , başqa bir şey.

312
10 дек. cavab user225312 10 dec. tərəfindən verilir . 2010-12-10 09:48 '10 at 9:48 2010-12-10 09:48

Bu səhvi aldatmanın səbəbi, siyahı anlayışının necə yerinə yetirilməsi ilə bağlıdır.

Aşağıdakıları yadda saxlayın:

 [ expression for item in list if conditional ] 

Buna bərabərdir:

 for item in list: if conditional: expression 
border=0

expression bir az fərqli bir formatda olduğu hallarda (obyektin keçməsi və cümlədəki sözlərin düzəldilməsi barədə düşünmək).

Buna görə, [x+1 for x in l if x >= 45] kodu aşağıdakıları yerinə yetirir:

 for x in l: if x >= 45: x+1 

Bununla belə, bu kod [x+1 if x >= 45 else x+5 for x in l] bunu ( expression dəyişdirdikdən sonra) edir:

 for x in l: if x>=45: x+1 else: x+5 
175
10 дек. Cavab verilir arboc7 10 dekabr. 2010-12-10 11:00 '10 saat 11:00 'da 2010-12-10 11:00' da
 [x+1 if x >= 45 else x+5 for x in l] 

Və mükafat üçün, mən bu səhvi ilk dəfə xatırlamaq üçün yazdığım bir şərhdir:

şərti ifadə Python a if C else b və aşağıdakı kimi istifadə edilə bilməz:

 [a for i in items if C else b] 

Düzgün forma:

 [a if C else b for i in items] 

Düzgün bir forma olmasına baxmayaraq:

 [a for i in items if C] 

Amma bu C tərəfindən süzgəcin eyni şey deyil, ancaq onları birləşdirə bilərsiniz:

 [a if tC else b for i in items if fC] 
106
10 дек. Cavab Dan D. 10 dekabr. 2010-12-10 09:48 '10 at 9:48 2010-12-10 09:48

Sözün anlayışının əvvəlində ifadəni yerləşdirməlisiniz, əgər ifadənin sonunda elementləri süzsənirsə!

 [x+1 if x >= 45 else x+5 for x in l] 
79
10 дек. Cavab AndiDog 10 Dekabr. 2010-12-10 09:48 '10 at 9:48 2010-12-10 09:48

Siz həmçinin siyahı daxilində mötərizədə şərti ifadə verə bilərsiniz:

  l = [22, 13, 45, 50, 98, 69, 43, 44, 1] print [[x+5,x+1][x >= 45] for x in l] 

[yanlış, doğru] [şərt] sintaksisidir

12
04 июля '14 в 9:50 2014-07-04 09:50 Cavab Stefan Gruenwald tərəfindən 04 İyul, '14 'da 9:50 2014-07-04 09:50 tərəfindən verilir

Bənzər bir problemim vardı və bu sualı tapdım və cavablar həqiqətən faydalıdır. Burada bir hissə məni qarışdırdı. Mən bunu açıq şəkildə yazıram, çünki heç kim, həqiqətən, yalnız ingilis dilində belə demişdi:

Yekateriya sona çatdı.

Adətən dövr keçir

 for this many times: if conditional: do this thing else: do something else 

Bütün bunlar ilk cavab kimi siyahı anlayışının bir hissəsini təşkil edir,

 [ expression for item in list if conditional ] 

lakin əslində bu, bu vəziyyətdə etdiyiniz şey deyil. (Bunu etməyə çalışdım)

Bu vəziyyətdə belə görünür:

 [ expression if conditional else other thing for this many times ] 
6
18 февр. Ssenari ilə cavab 18 fevral 2015-02-18 20:34 '15 'da 20:34' de 2015-02-18 20:34

Vəziyyəti aşağıdakılara köçürə bilərsiniz:

 v = [22, 13, 45, 50, 98, 69, 43, 44, 1] [ (x+1 if x >=45 else x+5) for x in v ] 

Ancaq bir az çirkin görünməyə başlayır, buna görə normal bir döngü istifadə etmək daha yaxşı ola bilər. Qeyd edək ki, 1 əvəzi ilə qarışıqlığı azaltmaq üçün l dəyişən bir siyahı əvəzinə istifadə edirəm ( lO hər hansı bir şəraitdə, hətta tez və çirkli bir nümunə kodunda belə dəyişən adlardan qaçınılmalıdır).

6
10 дек. Cavab Jeet 10 dekabr verilir. 2010-12-10 09:52 '10 at 9:52 2010-12-10 09:52

[a if condition1 else b for i in list1 if condition2] , condition1condition2 ilə iki [a if condition1 else b for i in list1 if condition2] iki fərqli şeydir. Bir hissəsi (a if condition1 else b) bir şərtdir1 (a if condition1 else b) lambda ifadəsidir:

 lambda x: a if condition1 else b 

digər condition2 isə başqa bir lambdadır:

 lambda x: condition2 

Bütün siyahısını anlama, mapfilter birləşməsi kimi baxıla bilər:

 map(lambda x: a if condition1 else b, filter(lambda x: condition2, list1)) 
5
02 февр. Xiaojun Chen tərəfindən verilmiş cavab 02 fevral. 2016-02-02 03:43 '16 at 3:43 2016-02-02 03:43

etiketləri ilə bağlı digər suallar və ya sual verin