รายการความเข้าใจบรรทัดเดียว: if-else ชุดรูปแบบ


178

มันเพิ่มเติมเกี่ยวกับไวยากรณ์ความเข้าใจรายการหลาม ฉันมีรายการความเข้าใจที่สร้างรายการเลขคี่ของช่วงที่กำหนด:

[x for x in range(1, 10) if x % 2]

สิ่งนี้ทำให้ตัวกรอง - ฉันมีรายการแหล่งที่มาซึ่งฉันจะลบเลขคู่ออก ( if x % 2) ฉันต้องการใช้บางอย่างเช่นถ้าเป็นอย่างอื่นที่นี่ รหัสต่อไปนี้ล้มเหลว:

>>> [x for x in range(1, 10) if x % 2 else x * 100]
  File "<stdin>", line 1
    [x for x in range(1, 10) if x % 2 else x * 100]
                                         ^
SyntaxError: invalid syntax

มีการแสดงออกของหลามเช่นถ้าอื่น:

1 if 0 is 0 else 3

วิธีใช้ภายในรายการเข้าใจ?


1
สิ่งที่คุ้มค่าคุณมี "ความเข้าใจในรายการ" ไม่ใช่เครื่องกำเนิดไฟฟ้า ไวยากรณ์ที่ดีที่สุดเหมือนกันยกเว้นเครื่องกำเนิดไฟฟ้าที่ใช้แทน() []
mgilson


2
มันเอาฉันในขณะที่ได้รับทำไมif x % 2 กำจัดแม้ตัวเลข (แทนการรักษาพวกเขา) - มันเป็นเพราะเมื่อxแม้แต่x % 2ผลการแสดงออกใน0ซึ่งในการเปิดการประเมินFalseในขณะใด ๆintยกเว้นประเมิน0 True

คำตอบ:


328

x if y else zเป็นไวยากรณ์สำหรับนิพจน์ที่คุณส่งคืนสำหรับแต่ละองค์ประกอบ ดังนั้นคุณต้อง:

[ x if x%2 else x*100 for x in range(1, 10) ]

ความสับสนเกิดขึ้นจากข้อเท็จจริงที่ว่าคุณกำลังใช้ตัวกรองในตัวอย่างแรก แต่ไม่ใช่ในครั้งที่สอง ในตัวอย่างที่สองคุณเท่านั้นทำแผนที่มูลค่าให้กับอีกแต่ละใช้การแสดงออกที่ประกอบไปด้วยผู้ประกอบการ

ด้วยตัวกรองคุณต้องการ:

[ EXP for x in seq if COND ]

ไม่มีตัวกรองที่คุณต้องการ:

[ EXP for x in seq ]

และในตัวอย่างที่สองของคุณแสดงออกเป็น "ซับซ้อน" if-elseหนึ่งที่เกิดขึ้นจะเกี่ยวข้องกับการ


2
ฉันมีคำถามหนึ่งข้อ ... [x for x in range(1, 10) if x % 2]เป็นไวยากรณ์ที่ถูกต้อง [x if x % 2 for x in range(1, 10)]- นี่ไม่ใช่ แต่[x if x%2 else x*100 for x in range(1, 10)]เป็นอีกครั้งที่ถูกต้องของไวยากรณ์ มาทำไม
ducin

@tkoomzaaskz ในตัวอย่างที่สองของคุณนี่ไม่ใช่ตัวดำเนินการ ternary-if-else (ไม่มี the else) และไม่มีตัวกรอง (เนื่องจากอยู่ในEXPส่วนของความเข้าใจในรายการ)
shx2

3
@tkoomzaaskz เพื่อชี้แจงเพิ่มเติมโปรดทราบว่าคุณสามารถเพิ่มวินาทีifในตอนท้าย: [x if x%2 else x*100 for x in range(1, 10) if not x%3]ครั้งแรกifเป็นส่วนหนึ่งของผู้ประกอบการที่สามส่วนที่สองifเป็นส่วนหนึ่งของไวยากรณ์รายการความเข้าใจ ทั้งหมดx if x%2 else x*100คือ "ในระดับเดียวกัน" อย่างง่าย2*xมันเป็นนิพจน์ที่จะประเมินทางด้านซ้ายของforเมื่อการกรองของif not x%3เกิดขึ้นแล้ว
zx81

สวัสดีข้อความหนึ่งบรรทัดจะมีประสิทธิภาพมากกว่าการทำสองบรรทัดเช่นfor i in x:นั้นในการวนซ้ำif i == y:หรือไม่
Alexis.Rolland


12

คุณสามารถทำได้ด้วย list comprehension ด้วย:

A=[[x*100, x][x % 2 != 0] for x in range(1,11)]
print A

1
ดีมาก. ชิ้นบูลีน ขอบคุณคุณให้ฉันอ่านวิธีที่ง่ายขึ้น

นอกจากนี้คุณยังสามารถมอบหมายสองอย่างดังนี้: A, B = [10,11] [a == 19], [1,14] [a == 20]
Stefan Gruenwald

10

อีกวิธีหนึ่งหวังว่าบางคนอาจชอบ:

การใช้: [เท็จจริง] [นิพจน์]

>>> map(lambda x: [x*100, x][x % 2 != 0], range(1,10))
[1, 200, 3, 400, 5, 600, 7, 800, 9]
>>>

3

ฉันสามารถทำสิ่งนี้ได้

>>> [x if x % 2 != 0 else x * 100 for x in range(1,10)]
    [1, 200, 3, 400, 5, 600, 7, 800, 9]
>>>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.