จากรายการ['a','ab','abc','bac']
ฉันต้องการคำนวณรายการด้วยสตริงที่มี'ab'
อยู่ในรายการ ['ab','abc']
คือผลที่ได้คือ วิธีนี้สามารถทำได้ใน Python?
จากรายการ['a','ab','abc','bac']
ฉันต้องการคำนวณรายการด้วยสตริงที่มี'ab'
อยู่ในรายการ ['ab','abc']
คือผลที่ได้คือ วิธีนี้สามารถทำได้ใน Python?
คำตอบ:
การกรองแบบธรรมดานี้สามารถทำได้หลายวิธีด้วย Python แนวทางที่ดีที่สุดคือการใช้ "รายการเพื่อความเข้าใจ" ดังนี้:
>>> lst = ['a', 'ab', 'abc', 'bac']
>>> [k for k in lst if 'ab' in k]
['ab', 'abc']
อีกวิธีหนึ่งคือการใช้filter
ฟังก์ชัน ใน Python 2:
>>> filter(lambda k: 'ab' in k, lst)
['ab', 'abc']
ใน Python 3 จะส่งคืนตัววนซ้ำแทนที่จะเป็นรายการ แต่คุณสามารถส่งได้:
>>> list(filter(lambda k: 'ab' in k, lst))
['ab', 'abc']
แม้ว่าจะเป็นการดีกว่าที่จะใช้ความเข้าใจ
lambda
คู่หูที่สมบูรณ์แบบfilter
ในกรณีนี้? ฉันคิดว่าการเขียนฟังก์ชันแยกต่างหากเพื่อตรวจสอบว่าab
อยู่ในรายการที่กำหนดนั้นเป็นการใช้งานมากเกินไป ดังนั้นการเขียนฟังก์ชันทั่วไปที่in
ครอบคลุมตัวดำเนินการ คุณจะใช้อย่างไรfilter
ให้ชัดเจนยิ่งขึ้นหากไม่มีlambda
ที่นี่?
[x for x in L if 'ab' in x]
# To support matches from the beginning, not any matches:
items = ['a', 'ab', 'abc', 'bac']
prefix = 'ab'
filter(lambda x: x.startswith(prefix), items)
ลองใช้สิ่งนี้อย่างรวดเร็วในเชลล์แบบโต้ตอบ:
>>> l = ['a', 'ab', 'abc', 'bac']
>>> [x for x in l if 'ab' in x]
['ab', 'abc']
>>>
ทำไมถึงได้ผล? เนื่องจากมีin
การกำหนดตัวดำเนินการให้สตริงหมายถึง: "เป็นสตริงย่อยของ"
นอกจากนี้คุณอาจต้องการพิจารณาการเขียนวนซ้ำซึ่งตรงข้ามกับการใช้ไวยากรณ์ความเข้าใจรายการที่ใช้ข้างต้น:
l = ['a', 'ab', 'abc', 'bac']
result = []
for s in l:
if 'ab' in s:
result.append(s)
mylist = ['a', 'ab', 'abc']
assert 'ab' in mylist