2015-10-08 7 views
15

का उपयोग करके दस्तावेज़ में प्रत्येक शब्द की घटना की गणना कैसे कर सकता हूं मेरे पास ग्रंथों से युक्त पायथन में सूचियों की एक सूची है। यह प्रत्येक दस्तावेज़ से सेट शब्दों की तरह है। इसलिए प्रत्येक दस्तावेज़ के लिए मेरे पास एक सूची है और फिर सभी दस्तावेजों के लिए सूची में है।डिक्शनरी समझ

सभी सूची में केवल अनन्य शब्द हैं। मेरा उद्देश्य पूरे दस्तावेज़ में प्रत्येक शब्द की घटना को गिनना है। मैं नीचे दिए गए कोड का उपयोग करके सफलतापूर्वक ऐसा करने में सक्षम हूं:

for x in texts_list: 
    for l in x: 
     if l in term_appearance: 
      term_appearance[l] += 1 
     else: 
      term_appearance[l] = 1 

लेकिन मैं ऐसा करने के लिए शब्दकोश समझ का उपयोग करना चाहता हूं।

from collections import defaultdict 
term_appearance = defaultdict(int) 

{{term_appearance[l] : term_appearance[l] + 1 if l else term_appearance[l] : 1 for l in x} for x in texts_list} 

संदर्भ के लिए पिछला पोस्ट:

Simple syntax error in Python if else dict comprehension

यह पहली बार है, मैं समझ शब्दकोश लिखने की कोशिश कर और stackoverflow में पिछले मौजूदा पदों का उपयोग कर रहा है, मैं निम्नलिखित लिखने के लिए सक्षम किया गया है

{{l : term_appearance[l] + 1 if l else 1 for l in x} for x in texts_list} 

ऊपर कोड जनसंपर्क में सफल रहा था:

जैसा कि ऊपर पोस्ट में सुझाव दिया है, मैं भी निम्न कोड का इस्तेमाल किया है

[] 

[] 

[] 

[] 

Traceback (most recent call last): 

    File "term_count_fltr.py", line 28, in <module> 

    {{l : term_appearance[l] + 1 if l else 1 for l in x} for x in texts_list} 
    File "term_count_fltr.py", line 28, in <setcomp> 

    {{l : term_appearance[l] + 1 if l else 1 for l in x} for x in texts_list} 

TypeError: unhashable type: 'dict' 

मेरे वर्तमान समझ में सुधार करने में किसी भी मदद की बहुत सराहना की जाएगी: खाली सूचियों oducing लेकिन अंत में निम्नलिखित ट्रैसबैक फेंक दिया।

उपरोक्त त्रुटि को देखते हुए, मैं भी

[{l : term_appearance[l] + 1 if l else 1 for l in x} for x in texts_list] 

यह किसी भी त्रुटि के बिना भाग गया कोशिश की, लेकिन उत्पादन केवल खाली सूचियों था।

+0

गुड लक ... यहाँ एक विचार है, डिफ़ॉल्ट dict शून्य करने के लिए लागू हो जाएगी, आप अगर-बाकी हिस्सा की आवश्यकता न पड़े इसका मतलब है । – nehemiah

उत्तर

12

अन्य उत्तरों में समझाया गया है, तो मुद्दा यह है कि शब्दकोश समझ एक नया शब्दकोश बनाता है, इसलिए जब तक इसे बनाया गया है तब तक आप उस नए शब्दकोश का संदर्भ नहीं लेते। आप जो कर रहे हैं उसके लिए आप शब्दकोश समझ नहीं सकते हैं।

यह देखते हुए कि, आप जो कर रहे हैं उसे पुनः लागू करने का प्रयास कर रहा है जो पहले से ही collections.Counter द्वारा किया गया है। आप बस Counter का उपयोग कर सकते हैं।उदाहरण -

from collections import Counter 
term_appearance = Counter() 
for x in texts_list: 
    term_appearance.update(x) 

डेमो -

>>> l = [[1,2,3],[2,3,1],[5,4,2],[1,1,3]] 
>>> from collections import Counter 
>>> term_appearance = Counter() 
>>> for x in l: 
...  term_appearance.update(x) 
... 
>>> term_appearance 
Counter({1: 4, 2: 3, 3: 3, 4: 1, 5: 1}) 

तुम सच में समझ के कुछ प्रकार में ऐसा करना चाहते हैं, तो आप कर सकते हैं:

from collections import Counter 
term_appearance = Counter() 
[term_appearance.update(x) for x in texts_list] 

डेमो -

>>> l = [[1,2,3],[2,3,1],[5,4,2],[1,1,3]] 
>>> from collections import Counter 
>>> term_appearance = Counter() 
>>> [term_appearance.update(x) for x in l] 
[None, None, None, None] 
>>> term_appearance 
Counter({1: 4, 2: 3, 3: 3, 4: 1, 5: 1}) 

आउटपुट [None, None, None, None] fr है ओम सूची की समझ के परिणामस्वरूप उस सूची में परिणाम (क्योंकि यह अंतःक्रियात्मक रूप से चलाया गया था), यदि आप इसे स्क्रिप्ट में python <script> के रूप में चलाते हैं, तो उस आउटपुट को केवल त्याग दिया जाएगा।


तुम भी itertools.chain.from_iterable() का उपयोग अपने text_lists से एक चपटा सूची बनाने और उसके बाद का उपयोग करें कि काउंटर के लिए कर सकते हैं। उदाहरण:

from collections import Counter 
from itertools import chain 
term_appearance = Counter(chain.from_iterable(texts_list)) 

डेमो -

>>> from collections import Counter 
>>> from itertools import chain 
>>> term_appearance = Counter(chain.from_iterable(l)) 
>>> term_appearance 
Counter({1: 4, 2: 3, 3: 3, 4: 1, 5: 1}) 

इसके अलावा, लाइन में अपने मूल कोड में एक और मुद्दा -

{{term_appearance[l] : term_appearance[l] + 1 if l else term_appearance[l] : 1 for l in x} for x in texts_list} 

यह वास्तव में एक शब्दकोश समझ के साथ एक सेट समझ नीडिंत है के भीतर।

यही कारण है कि आपको त्रुटि मिल रही है - TypeError: unhashable type: 'dict'। क्योंकि पहली बार शब्दकोश समझ को चलाने और dict बनाने के बाद, यह set में जोड़ने की कोशिश कर रहा है। लेकिन शब्दकोश हर्षनीय नहीं हैं, इसलिए त्रुटि।

6

कारण आपको अस्थिर प्रकार त्रुटि मिल रही है यह है कि आप पाइथन में किसी अन्य शब्दकोश के लिए कुंजी के रूप में एक शब्दकोश का उपयोग नहीं कर सकते हैं, क्योंकि वे परिवर्तनीय कंटेनर हैं।

देखें: why dict objects are unhashable in python?

3

अजगर 2.7+ में शब्दकोश comprehensions जिस तरह से आप सोच सकते हैं वे काम करते हैं काम नहीं करते।

जैसा सूची comprehensions, वे एक नई शब्दकोश बनाने लेकिन आप एक पहले से हीमौजूदा शब्दकोश में कुंजी जोड़ने के लिए (जो इस मामले में आप क्या करने की कोशिश कर रहे हैं क्या है) उनका उपयोग नहीं कर सकते हैं।

3

answerAnand S Kumar पर देखें यदि आप collections.Counter का उपयोग करना चाहते हैं जो एक अच्छा सुझाव है। लेकिन वहाँ collections.defaultdict जो मैं उल्लेख के लायक लगता है उपयोग करने से संबंधित एक अन्य समाधान है:

from collections import defaultdict 

text_appearances = defaultdict() 

for x in texts_lists: 
    for l in x: 
     text_appearances[l] += 1 

मैं इस कुछ समय का निर्माण का उपयोग किया है, और मुझे लगता है कि गिनती करने का एक स्वच्छ और अच्छा तरीका है। विशेष रूप से यदि आपको किसी कारण से लूप में कुछ सत्यापन करने की आवश्यकता है, तो यह चिंता किए बिना सीधे गिनती को अपडेट करने का एक प्रभावी तरीका है कि कुंजी/शब्द आपके शब्दकोश में पहले से मौजूद है (जैसे आपके पहले समाधान में)। चर नामकरण पर

Sidenote: कृपया एक चर नाम के रूप में छोटे अक्षरों l (L की लोअरकेस) का उपयोग नहीं करते, यह 1 (नंबर एक) से अलग करना मुश्किल है। आपके मामले में शायद आप चर, words और word नाम दे सकते हैं? एक पोस्टफ़िक्स रूप _list का उपयोग नहीं के अलावा के साथ, कोड पढ़ सकता है:

for words in texts: 
    for word in words: 
     text_appearance[word] += 1 
संबंधित मुद्दे