1) สไตล์เกือบภาษาอังกฤษ:
ทดสอบสถานะโดยใช้in
โอเปอเรเตอร์แล้วใช้remove
วิธี
if thing in some_list: some_list.remove(thing)
remove
วิธีการจะลบเฉพาะเกิดขึ้นครั้งแรกของthing
เพื่อที่จะลบที่เกิดขึ้นทั้งหมดที่คุณสามารถใช้แทนwhile
if
while thing in some_list: some_list.remove(thing)
- ง่ายพออาจเป็นทางเลือกของฉันสำหรับรายการเล็ก ๆ (ไม่สามารถต้านทานหนึ่งสมุทร)
ทัศนคติการถามคำถามครั้งสุดท้ายครั้งสุดท้ายเป็นเรื่องธรรมดาใน Python แทนที่จะทำการทดสอบล่วงหน้าหากวัตถุมีความเหมาะสมเพียงดำเนินการและรับข้อยกเว้นที่เกี่ยวข้อง:
try:
some_list.remove(thing)
except ValueError:
pass # or scream: thing not in some_list!
except AttributeError:
call_security("some_list not quacking like a list!")
นอกหลักสูตรข้อที่สองยกเว้นในตัวอย่างข้างต้นไม่เพียง แต่มีอารมณ์ขันที่น่าสงสัย แต่ไม่จำเป็นทั้งหมด (ประเด็นคือเพื่อแสดงให้เห็นถึงการพิมพ์เป็ดสำหรับคนที่ไม่คุ้นเคยกับแนวคิด
หากคุณคาดหวังสิ่งต่าง ๆ ที่เกิดขึ้น:
while True:
try:
some_list.remove(thing)
except ValueError:
break
- verbose เล็กน้อยสำหรับกรณีการใช้งานเฉพาะนี้ แต่มีสำนวนใน Python มาก
- สิ่งนี้ทำงานได้ดีกว่า # 1
- PEP 463เสนอไวยากรณ์ที่สั้นกว่าสำหรับลอง / ยกเว้นการใช้งานง่าย ๆ ที่จะมีประโยชน์ที่นี่ แต่ก็ไม่ได้รับการอนุมัติ
อย่างไรก็ตามด้วยการกำจัด contextlib () contextmanager (แนะนำใน python 3.4) โค้ดด้านบนสามารถทำให้ง่ายขึ้นในเรื่องนี้:
with suppress(ValueError, AttributeError):
some_list.remove(thing)
อีกครั้งหากคุณคาดหวังสิ่งต่าง ๆ ที่เกิดขึ้น:
with suppress(ValueError):
while True:
some_list.remove(thing)
3) สไตล์การทำงาน:
รอบปี 1993 มีงูหลามlambda
, reduce()
, filter()
และmap()
มารยาทของเสียงกระเพื่อมของแฮ็กเกอร์ที่พลาดพวกเขาและส่งแพทช์การทำงาน * คุณสามารถใช้filter
เพื่อลบองค์ประกอบออกจากรายการ:
is_not_thing = lambda x: x is not thing
cleaned_list = filter(is_not_thing, some_list)
มีทางลัดที่อาจเป็นประโยชน์สำหรับกรณีของคุณ: หากคุณต้องการกรองรายการเปล่า (ในความเป็นจริงรายการที่bool(item) == False
ชอบNone
, เป็นศูนย์, สตริงว่างหรือคอลเลกชันว่างอื่น ๆ ) คุณสามารถส่ง None เป็นอาร์กิวเมนต์แรก:
cleaned_list = filter(None, some_list)
- [อัพเดต] : ใน Python 2.x
filter(function, iterable)
ใช้เพื่อเทียบเท่า[item for item in iterable if function(item)]
(หรือ[item for item in iterable if item]
ถ้าอาร์กิวเมนต์แรกคือNone
); ในหลาม 3.x (item for item in iterable if function(item))
ก็คือตอนนี้เทียบเท่ากับ ความแตกต่างที่ลึกซึ้งเป็นตัวกรองที่ใช้ในการกลับรายการตอนนี้ก็ทำงานเหมือนการแสดงออกกำเนิด - นี่คือตกลงถ้าคุณเป็นเพียงการทำซ้ำมากกว่ารายการทำความสะอาดและทิ้งมัน แต่ถ้าคุณต้องการรายการจริงๆคุณต้องใส่filter()
โทร กับตัวlist()
สร้าง
- * โครงสร้าง Lispy เหล่านี้ถือเป็นเอเลี่ยนตัวน้อยใน Python รอบปี 2005 กุยแม้กระทั่งการพูดคุยเกี่ยวกับการลดลง
filter
- พร้อมกับสหายmap
และreduce
(พวกเขาจะไม่ได้หายไป แต่ยังreduce
ถูกย้ายเข้ามาอยู่functoolsโมดูลซึ่งมีค่าดูถ้าคุณชอบฟังก์ชั่นการสั่งซื้อสูง )
4) สไตล์คณิตศาสตร์:
comprehensions รายการกลายเป็นรูปแบบที่ต้องการสำหรับการจัดการรายชื่อในหลามตั้งแต่การแนะนำในรุ่น 2.0 โดยPEP 202 เหตุผลเบื้องหลังก็คือ comprehensions รายการให้เป็นวิธีที่รัดกุมมากขึ้นเพื่อสร้างรายการในสถานการณ์ที่map()
และfilter()
และ / หรือลูปซ้อนกันอยู่ในปัจจุบันจะถูกนำมาใช้
cleaned_list = [ x for x in some_list if x is not thing ]
การแสดงออกกำเนิดเป็นที่รู้จักในรุ่น 2.4 โดยPEP 289 นิพจน์ตัวสร้างจะดีกว่าสำหรับสถานการณ์ที่คุณไม่ต้องการ (หรือต้องการ) เพื่อสร้างรายการทั้งหมดในหน่วยความจำเช่นเมื่อคุณต้องการวนซ้ำองค์ประกอบหนึ่งครั้ง หากคุณทำซ้ำเฉพาะรายการคุณสามารถนึกถึงนิพจน์ตัวสร้างเป็นความเข้าใจเกี่ยวกับรายการแบบประเมินที่ขี้เกียจ :
for item in (x for x in some_list if x is not thing):
do_your_thing_with(item)
หมายเหตุ
- คุณอาจต้องการใช้ตัวดำเนินการอสมการ
!=
แทนis not
( ความแตกต่างสำคัญ )
- สำหรับนักวิจารณ์ของวิธีการที่แสดงสำเนารายการ: ตรงกันข้ามกับความเชื่อที่ได้รับความนิยมนิพจน์เครื่องกำเนิดไฟฟ้าไม่ได้มีประสิทธิภาพมากกว่าการทำความเข้าใจรายการ - โปรดใส่รายละเอียดก่อนบ่น