การกรองรายการสตริงตามเนื้อหา


104

จากรายการ['a','ab','abc','bac']ฉันต้องการคำนวณรายการด้วยสตริงที่มี'ab'อยู่ในรายการ ['ab','abc']คือผลที่ได้คือ วิธีนี้สามารถทำได้ใน Python?

คำตอบ:


173

การกรองแบบธรรมดานี้สามารถทำได้หลายวิธีด้วย 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']

แม้ว่าจะเป็นการดีกว่าที่จะใช้ความเข้าใจ


31
@ S.Lott: ทำไม? เกิดอะไรขึ้นกับการเรียนรู้หัวข้อการเขียนโปรแกรมขั้นสูงที่มีประโยชน์ในบริบทที่เหมาะสม
Eli Bendersky

12
@ S.Lott: ฉันคิดว่า lambdas อำนวยความสะดวกในการพิจารณาฟังก์ชันเป็นวัตถุชั้นหนึ่งซึ่งเป็นสิ่งสำคัญสำหรับกระบวนทัศน์การเขียนโปรแกรมบางอย่าง ฉันจะไม่พูดว่าพวกเขากำลังสำคัญมากกับผมแต่ผมเชื่อว่าแม้กระทั่งมือใหม่ที่จะได้ประโยชน์จากความคิดเกี่ยวกับการเขียนโปรแกรมด้วยวิธีนี้และแน่นอนจะไม่เรียกว่าก่อให้เกิดความ
Eli Bendersky

6
@ S.Lott: แต่ไม่ใช่lambdaคู่หูที่สมบูรณ์แบบfilterในกรณีนี้? ฉันคิดว่าการเขียนฟังก์ชันแยกต่างหากเพื่อตรวจสอบว่าabอยู่ในรายการที่กำหนดนั้นเป็นการใช้งานมากเกินไป ดังนั้นการเขียนฟังก์ชันทั่วไปที่inครอบคลุมตัวดำเนินการ คุณจะใช้อย่างไรfilterให้ชัดเจนยิ่งขึ้นหากไม่มีlambdaที่นี่?
Eli Bendersky

5
ไม่ใช่แค่ n00bs เท่านั้นที่พบคำตอบนี้
ไบรอัน

10
ฉันเป็น n00b และตอนนี้ฉันได้รู้จักกับแลมด้า รู้สึกดีที่ได้รู้ ตอนนี้ฉันจะเรียนรู้เพิ่มเติมเกี่ยวกับเรื่องนี้
a_secenthusiast


16
# To support matches from the beginning, not any matches:

items = ['a', 'ab', 'abc', 'bac']
prefix = 'ab'

filter(lambda x: x.startswith(prefix), items)

หลีกเลี่ยงรายการเป็นชื่อตัวแปรเนื่องจากเป็นประเภทวัตถุ python
Rutger Hofste

6

ลองใช้สิ่งนี้อย่างรวดเร็วในเชลล์แบบโต้ตอบ:

>>> 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)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.