कैसे सूची समझ अजगर में छोरों के लिए दो फ्रेम करने के लिए


101

मेरे पास नीचे के रूप में दो सूचियाँ हैं

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))
अश्विनी चौधरी

जवाबों:


135

यह करना चाहिए:

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

157

इसे याद रखने का सबसे अच्छा तरीका यह है कि सूची की समझ के अंदर लूप का क्रम उस क्रम पर आधारित है जिसमें वे पारंपरिक लूप दृष्टिकोण में दिखाई देते हैं। बाहरी लूप सबसे पहले आता है, और फिर आंतरिक लूप बाद में।

तो, समान सूची की समझ होगी:

[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

उपयुक्त नियंत्रण रेखा होगी

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

नियंत्रण रेखा में छोरों का क्रम नेस्टेड छोरों के समान है, अगर बयान अंत तक जाते हैं और सशर्त अभिव्यक्ति शुरुआत में जाते हैं, कुछ इस तरह

[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']]

EDIT - चूंकि, आपको परिणाम को चपटा करने की आवश्यकता है, आप एक समान सूची समझ का उपयोग कर सकते हैं और फिर परिणाम को समतल कर सकते हैं।

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

समझ में, नेस्टेड सूचियाँ पुनरावृत्ति लूप के लिए समान imbricated की तुलना में समान आदेश का पालन करना चाहिए।

समझने के लिए, हम एनएलपी से एक सरल उदाहरण लेंगे। आप वाक्यों की सूची से सभी शब्दों की एक सूची बनाना चाहते हैं जहाँ प्रत्येक वाक्य शब्दों की सूची है।

>>> 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
नमस्ते और ढेर अतिप्रवाह में आपका स्वागत है! कृपया एक स्पष्टीकरण पोस्ट करें और न केवल कोड।
एवलिन

1
हैलो! हालांकि यह कोड प्रश्न को हल कर सकता है, जिसमें यह भी बताया गया है कि यह समस्या कैसे और क्यों हल करती है, इससे वास्तव में आपके पोस्ट की गुणवत्ता को बेहतर बनाने में मदद मिलेगी, और शायद अधिक वोट भी मिलेंगे। याद रखें कि आप भविष्य में पाठकों के लिए सवाल का जवाब दे रहे हैं, न कि केवल उस व्यक्ति से जो अब पूछ रहा है। कृपया स्पष्टीकरण जोड़ने के लिए अपने उत्तर को संपादित करें और संकेत दें कि क्या सीमाएँ और मान्यताएँ लागू होती हैं।
ब्रायन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.