แสดงรายการความเข้าใจด้วยคำสั่ง if


107

ฉันต้องการเปรียบเทียบ 2 รายการซ้ำและพิมพ์รายการที่ปรากฏในทั้งสองรายการ

>>> a = ('q', 'r')
>>> b = ('q')


# Iterate over a. If y not in b, print y.
# I want to see ['r'] printed.
>>> print([ y if y not in b for y in a])
                              ^

แต่มันทำให้ฉันมีข้อผิดพลาดทางไวยากรณ์ที่ไม่ถูกต้องที่^วางไว้ ฟังก์ชัน lamba นี้มีข้อผิดพลาดอย่างไร


5
คำตอบทั้งหมดด้านล่างนี้ถูกต้อง แต่ก็b = ('q')ไม่ได้สร้างทูเพิล สิ่งที่มีองค์ประกอบเดียวจำเป็นต้องมีความชัดเจน,นั่นคือb = ('q',)
dmg

ฉันได้เปลี่ยนtuplesเป็นiterables.
OrangeTux

คำตอบ:


187

คุณสั่งซื้อผิด ifควรจะเป็นหลังจากที่for(ยกเว้นว่าจะอยู่ในif-elseผู้ประกอบ ternary)

[y for y in a if y not in b]

วิธีนี้จะได้ผล:

[y if y not in b else other_value for y in a]

ขอบคุณ. ฉันเห็นโพสต์นี้stackoverflow.com/questions/4406389/…เกี่ยวกับคำสั่ง if else ในฟังก์ชันแลมบ์ดา และฉันคิดว่าการใช้คำสั่ง if เท่านั้น (โดยไม่มีคำสั่งอื่น) จะทำงานในลำดับเดียวกัน
OrangeTux

39

คุณใส่ifในตอนท้าย:

[y for y in a if y not in b]

ความเข้าใจในรายการเขียนในลำดับเดียวกับคู่ที่ระบุแบบเต็มที่ซ้อนกันโดยพื้นฐานแล้วข้อความข้างต้นแปลเป็น:

outputlist = []
for y in a:
    if y not in b:
        outputlist.append(y)

เวอร์ชันของคุณพยายามทำสิ่งนี้แทน:

outputlist = []
if y not in b:
    for y in a:
        outputlist.append(y)

แต่ความเข้าใจในรายการต้องเริ่มต้นด้วยวงนอกอย่างน้อยหนึ่งวง


7

สูตรความเข้าใจรายการ:

[<value_when_condition_true> if <condition> else <value_when_condition_false> for value in list_name]

ดังนั้นคุณสามารถทำได้ดังนี้:

[y for y in a if y not in b]

เพื่อจุดประสงค์ในการสาธิตเท่านั้น: [y if y not in b else False for y in a]


2
คุณไม่สามารถใส่ความเข้าใจelseในรายการไม่ใช่ที่ที่คุณใส่ไว้อย่างน้อย อย่าสับสนกับความเข้าใจในรายการ (การกรอง) ด้วยนิพจน์เงื่อนไข (ซึ่งต้องมีค่าทำให้นิพจน์อื่นบังคับ)
Martijn Pieters

ตกลง. elseใช้ในการทำความเข้าใจรายการแม้ว่าตามที่แสดงในรหัส
Vishvajit Pathak

2
นั่นคือการแสดงออกของเงื่อนไข สามารถใช้ได้ทุกที่ที่ใช้นิพจน์ที่ถูกต้อง ไม่ได้เจาะจงเฉพาะรายการความเข้าใจ
Martijn Pieters

5

นี่ไม่ใช่ฟังก์ชันแลมบ์ดา มันเป็นความเข้าใจรายการ

เพียงแค่เปลี่ยนคำสั่ง:

[ y for y in a if y not in b]
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.