แยก แทนที่ และแปลงองค์ประกอบเฉพาะของรายการ Python (อาร์เรย์)

ธุรกิจ

ในการสร้างรายการใหม่ใน 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]

นิพจน์ใช้กับองค์ประกอบที่ตรงกับนิพจน์เงื่อนไขของวัตถุที่ทำซ้ำได้ (เช่น รายการหรือทูเปิล) และกลายเป็นองค์ประกอบของรายการใหม่ สามารถละเว้น “ถ้านิพจน์เงื่อนไข” ได้ ซึ่งในกรณีนี้ นิพจน์จะถูกนำไปใช้กับองค์ประกอบทั้งหมด

ดูบทความต่อไปนี้สำหรับรายละเอียดเพิ่มเติม รวมทั้งสัญกรณ์ความเข้าใจรายการซ้อน

ใช้กระบวนการกับองค์ประกอบทั้งหมดของรายการ

ตัวอย่างเช่น หากคุณต้องการใช้การประมวลผลบางอย่างกับองค์ประกอบทั้งหมดของรายการ ให้อธิบายการประมวลผลที่ต้องการในนิพจน์ความเข้าใจรายการด้านบน

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]