จากรายการ['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