วิธีการเฟรมสองสำหรับลูปใน python ความเข้าใจรายการ


106

ฉันมีสองรายการดังต่อไปนี้

tags = [u'man', u'you', u'are', u'awesome']
entries = [[u'man', u'thats'],[ u'right',u'awesome']]

ฉันต้องการแยกรายการจากentriesเมื่ออยู่ในtags:

result = []

for tag in tags:
    for entry in entries:
        if tag in entry:
            result.extend(entry)

ฉันจะเขียนสองลูปเป็นความเข้าใจรายการบรรทัดเดียวได้อย่างไร


3
ใช้itertools.chainถ้าคุณต้องการแบนรายการ:list(chain.from_iterable(entry for tag in tags for entry in entries if tag in entry))
Ashwini Chaudhary

คำตอบ:


146

สิ่งนี้ควรทำ:

[entry for tag in tags for entry in entries if tag in entry]

163

วิธีที่ดีที่สุดในการจำสิ่งนี้คือลำดับของการวนซ้ำภายในความเข้าใจรายการจะขึ้นอยู่กับลำดับที่ปรากฏในวิธีการวนซ้ำ ลูปด้านนอกส่วนใหญ่มาก่อนแล้วลูปด้านในตามมา

ดังนั้นความเข้าใจในรายการที่เทียบเท่าจะเป็น:

[entry for tag in tags for entry in entries if tag in entry]

โดยทั่วไปif-elseคำสั่งจะมาก่อนคำสั่งแรกสำหรับลูปและถ้าคุณมีเพียงifคำสั่งคำสั่งนั้นจะมาที่ท้าย ตัวอย่างเช่นหากคุณต้องการเพิ่มรายการว่างหากtagไม่ได้อยู่ในรายการคุณจะทำดังนี้:

[entry if tag in entry else [] for tag in tags for entry in entries]

6

LC ที่เหมาะสมจะเป็น

[entry for tag in tags for entry in entries if tag in entry]

ลำดับของลูปใน LC นั้นคล้ายกับคำสั่งในลูปที่ซ้อนกันคำสั่ง if ไปที่จุดสิ้นสุดและนิพจน์เงื่อนไขจะอยู่ในจุดเริ่มต้นเช่น

[a if a else b for a in sequence]

ดูการสาธิต -

>>> tags = [u'man', u'you', u'are', u'awesome']
>>> entries = [[u'man', u'thats'],[ u'right',u'awesome']]
>>> [entry for tag in tags for entry in entries if tag in entry]
[[u'man', u'thats'], [u'right', u'awesome']]
>>> result = []
    for tag in tags:
        for entry in entries:
            if tag in entry:
                result.append(entry)


>>> result
[[u'man', u'thats'], [u'right', u'awesome']]

แก้ไข - เนื่องจากคุณต้องการผลลัพธ์ที่จะแบนคุณสามารถใช้การทำความเข้าใจรายการที่คล้ายกันแล้วทำให้ผลลัพธ์แบนราบ

>>> result = [entry for tag in tags for entry in entries if tag in entry]
>>> from itertools import chain
>>> list(chain.from_iterable(result))
[u'man', u'thats', u'right', u'awesome']

เมื่อเพิ่มสิ่งนี้เข้าด้วยกันคุณก็ทำได้

>>> list(chain.from_iterable(entry for tag in tags for entry in entries if tag in entry))
[u'man', u'thats', u'right', u'awesome']

คุณใช้นิพจน์ตัวสร้างที่นี่แทนการเข้าใจรายการ (สมบูรณ์ตรงกับขีด จำกัด 79 ตัวอักษรมากเกินไป (ไม่listโทร))


2
tags = [u'man', u'you', u'are', u'awesome']
entries = [[u'man', u'thats'],[ u'right',u'awesome']]

result = []
[result.extend(entry) for tag in tags for entry in entries if tag in entry]

print(result)

เอาท์พุต:

['man', 'thats', 'right', 'awesome']

0

ในการทำความเข้าใจการทำซ้ำรายการที่ซ้อนกันควรเป็นไปตามลำดับเดียวกันกับที่เทียบเท่ากันสำหรับลูป

เพื่อให้เข้าใจเราจะนำตัวอย่างง่ายๆจาก NLP คุณต้องการสร้างรายการคำทั้งหมดจากรายการประโยคโดยแต่ละประโยคเป็นรายการคำศัพท์

>>> list_of_sentences = [['The','cat','chases', 'the', 'mouse','.'],['The','dog','barks','.']]
>>> all_words = [word for sentence in list_of_sentences for word in sentence]
>>> all_words
['The', 'cat', 'chases', 'the', 'mouse', '.', 'The', 'dog', 'barks', '.']

หากต้องการลบคำที่ซ้ำกันคุณสามารถใช้ชุด {} แทนรายการ []

>>> all_unique_words = list({word for sentence in list_of_sentences for word in sentence}]
>>> all_unique_words
['.', 'dog', 'the', 'chase', 'barks', 'mouse', 'The', 'cat']

หรือสมัคร list(set(all_words))

>>> all_unique_words = list(set(all_words))
['.', 'dog', 'the', 'chases', 'barks', 'mouse', 'The', 'cat']

0
return=[entry for tag in tags for entry in entries if tag in entry for entry in entry]

6
สวัสดีและยินดีต้อนรับสู่ Stack Overflow! กรุณาโพสต์คำอธิบายไม่ใช่เฉพาะรหัส
Evelyn

1
สวัสดี! แม้ว่ารหัสนี้จะช่วยแก้ปัญหาได้รวมถึงคำอธิบายว่าทำไมจึงแก้ปัญหานี้ได้จะช่วยปรับปรุงคุณภาพของโพสต์ของคุณได้อย่างแท้จริงและอาจส่งผลให้มีการโหวตเพิ่มขึ้น จำไว้ว่าคุณกำลังตอบคำถามสำหรับผู้อ่านในอนาคตไม่ใช่แค่คนที่ถามตอนนี้ โปรดแก้ไขคำตอบของคุณเพื่อเพิ่มคำอธิบายและระบุข้อ จำกัด และสมมติฐานที่ใช้
Brian
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.