ในการสร้างรายการใหม่ใน Python โดยแยกหรือลบเฉพาะองค์ประกอบที่มีอยู่ของรายการ (อาร์เรย์) ที่ตรงตามเงื่อนไขบางประการ หรือโดยการแทนที่หรือแปลง ให้ใช้ความเข้าใจรายการ
มีการอธิบายสิ่งต่อไปนี้พร้อมกับโค้ดตัวอย่าง
- รูปแบบพื้นฐานของสัญกรณ์ความเข้าใจรายการ
- ใช้กระบวนการกับองค์ประกอบทั้งหมดของรายการ
- แยกและลบองค์ประกอบออกจากรายการที่ตรงตามเกณฑ์
- แทนที่หรือแปลงองค์ประกอบที่เป็นไปตามเงื่อนไขของรายการ
ดูบทความต่อไปนี้สำหรับตัวอย่างเฉพาะของรายการสตริง
นอกจากนี้ยังสามารถสุ่มแยกองค์ประกอบที่ไม่ตรงตามเกณฑ์
โปรดทราบว่ารายการสามารถจัดเก็บข้อมูลประเภทต่างๆ และแตกต่างจากอาร์เรย์โดยสิ้นเชิง หากคุณต้องการจัดการอาร์เรย์ในกระบวนการที่ต้องการขนาดหน่วยความจำและที่อยู่หน่วยความจำ หรือการประมวลผลตัวเลขของข้อมูลขนาดใหญ่ ให้ใช้อาร์เรย์ (ไลบรารีมาตรฐาน) หรือ NumPy
รายการต่อไปนี้เป็นตัวอย่าง
l = list(range(-5, 6))
print(l)
# [-5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5]
รูปแบบพื้นฐานของสัญกรณ์ความเข้าใจรายการ
เมื่อสร้างรายการใหม่จากรายการ ความเข้าใจของรายการจะเขียนได้ง่ายกว่าการวนซ้ำ
[expression for any variable name in iterable object if conditional expression]
นิพจน์ใช้กับองค์ประกอบที่ตรงกับนิพจน์เงื่อนไขของวัตถุที่ทำซ้ำได้ (เช่น รายการหรือทูเปิล) และกลายเป็นองค์ประกอบของรายการใหม่ สามารถละเว้น “ถ้านิพจน์เงื่อนไข” ได้ ซึ่งในกรณีนี้ นิพจน์จะถูกนำไปใช้กับองค์ประกอบทั้งหมด
ดูบทความต่อไปนี้สำหรับรายละเอียดเพิ่มเติม รวมทั้งสัญกรณ์ความเข้าใจรายการซ้อน
- ที่เกี่ยวข้อง:วิธีใช้ Python list comprehensions
ใช้กระบวนการกับองค์ประกอบทั้งหมดของรายการ
ตัวอย่างเช่น หากคุณต้องการใช้การประมวลผลบางอย่างกับองค์ประกอบทั้งหมดของรายการ ให้อธิบายการประมวลผลที่ต้องการในนิพจน์ความเข้าใจรายการด้านบน
l_square = [i**2 for i in l]
print(l_square)
# [25, 16, 9, 4, 1, 0, 1, 4, 9, 16, 25]
l_str = [str(i) for i in l]
print(l_str)
# ['-5', '-4', '-3', '-2', '-1', '0', '1', '2', '3', '4', '5']
สามารถใช้เพื่อแปลงระหว่างรายการตัวเลขและรายการสตริงได้
แยกและลบองค์ประกอบออกจากรายการที่ตรงตามเกณฑ์
หากองค์ประกอบถูกเลือกโดยนิพจน์เงื่อนไขเท่านั้น องค์ประกอบนั้นจะไม่ถูกประมวลผลโดยนิพจน์ ดังนั้นจะใช้รูปแบบต่อไปนี้
[variable name for variable name in original list if conditional expression]
รายการใหม่จะถูกสร้างขึ้นจากองค์ประกอบที่ตรงตามเงื่อนไขเท่านั้น (องค์ประกอบที่นิพจน์เงื่อนไขเป็นจริง) จะถูกแยกออก
l_even = [i for i in l if i % 2 == 0]
print(l_even)
# [-4, -2, 0, 2, 4]
l_minus = [i for i in l if i < 0]
print(l_minus)
# [-5, -4, -3, -2, -1]
หากตั้งค่า “ถ้านิพจน์เงื่อนไข” เป็น “ถ้าไม่ใช่นิพจน์เงื่อนไข” มันจะกลายเป็นการปฏิเสธ และสามารถเลือกและแยกเฉพาะองค์ประกอบที่ไม่เป็นไปตามเงื่อนไข (องค์ประกอบที่นิพจน์เงื่อนไขเป็นเท็จ) เท่านั้น กล่าวอีกนัยหนึ่ง รายการใหม่จะถูกสร้างขึ้นจากองค์ประกอบที่ตรงตามเงื่อนไขจะถูกลบออก
l_odd = [i for i in l if not i % 2 == 0]
print(l_odd)
# [-5, -3, -1, 1, 3, 5]
l_plus = [i for i in l if not i < 0]
print(l_plus)
# [0, 1, 2, 3, 4, 5]
แน่นอน ผลลัพธ์เดียวกันได้มาจากการระบุนิพจน์เงื่อนไขที่เทียบเท่าโดยไม่ต้องใช้ not
l_odd = [i for i in l if i % 2 != 0]
print(l_odd)
# [-5, -3, -1, 1, 3, 5]
l_plus = [i for i in l if i >= 0]
print(l_plus)
# [0, 1, 2, 3, 4, 5]
ส่วนนิพจน์เงื่อนไขสามารถเป็นได้หลายเงื่อนไข สามารถใช้โน้ตเชิงลบได้เช่นกัน
l_minus_or_even = [i for i in l if (i < 0) or (i % 2 == 0)]
print(l_minus_or_even)
# [-5, -4, -3, -2, -1, 0, 2, 4]
l_minus_and_odd = [i for i in l if (i < 0) and not (i % 2 == 0)]
print(l_minus_and_odd)
# [-5, -3, -1]
แทนที่หรือแปลงองค์ประกอบที่เป็นไปตามเงื่อนไขของรายการ
ในตัวอย่างของการแยกองค์ประกอบด้านบน องค์ประกอบที่ไม่เป็นไปตามเงื่อนไขจะถูกลบออก
หากคุณต้องการทำการแทนที่ การแปลง ฯลฯ เฉพาะในองค์ประกอบที่ตรงตามเงื่อนไข ให้ใช้ตัวดำเนินการ ternary กับส่วนนิพจน์ของสัญกรณ์ความเข้าใจรายการ
ใน Python ตัวดำเนินการ ternary สามารถเขียนได้ดังนี้
True Value if Conditional Expression else False Value
a = 80
x = 100 if a > 50 else 0
print(x)
# 100
b = 30
y = 100 if b > 50 else 0
print(y)
# 0
มันค่อนข้างซับซ้อน แต่การรวมกันของสัญกรณ์ความเข้าใจรายการและโอเปอเรเตอร์ประกอบเป็นดังนี้
[True Value if Conditional Expression else False Value for any variable name in original list]
ส่วนที่อยู่ในวงเล็บคือตัวดำเนินการ ternary (ไม่จำเป็นต้องใช้วงเล็บในโค้ดจริง)
[(True Value if Conditional Expression else False Value) for any variable name in original list]
หากมีการเขียนชื่อตัวแปรตามค่าจริงหรือเท็จ ค่าขององค์ประกอบดั้งเดิมจะถูกใช้ตามที่เป็นอยู่ หากมีการเขียนนิพจน์ การประมวลผลของนิพจน์นั้นจะถูกนำไปใช้
l_replace = [100 if i > 0 else i for i in l]
print(l_replace)
# [-5, -4, -3, -2, -1, 0, 100, 100, 100, 100, 100]
l_replace2 = [100 if i > 0 else 0 for i in l]
print(l_replace2)
# [0, 0, 0, 0, 0, 0, 100, 100, 100, 100, 100]
l_convert = [i * 10 if i % 2 == 0 else i for i in l]
print(l_convert)
# [-5, -40, -3, -20, -1, 0, 1, 20, 3, 40, 5]
l_convert2 = [i * 10 if i % 2 == 0 else i / 10 for i in l]
print(l_convert2)
# [-0.5, -40, -0.3, -20, -0.1, 0, 0.1, 20, 0.3, 40, 0.5]