2011-11-28 17 views
7

मैं एक पाइथन नौसिखिया स्मृति आवंटन की एक तालिका बनाने के लिए एक फ़ाइल को पार्स करने की कोशिश कर रहा हूं। मेरे इनपुट फ़ाइल निम्न स्वरूप में है:कुंजी के साथ पाइथन शब्दकोश कुंजी

48 bytes allocated at 0x8bb970a0 
24 bytes allocated at 0x8bb950c0 
48 bytes allocated at 0x958bd0e0 
48 bytes allocated at 0x8bb9b060 
96 bytes allocated at 0x8bb9afe0 
24 bytes allocated at 0x8bb9af60  

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

48 bytes -> 3 times 
96 bytes -> 1 times 
24 bytes -> 2 times 

(अब के लिए, मैं स्मृति पतों के बारे में चिंतित नहीं हूँ)

जब से मैं अजगर का उपयोग कर रहा है, मैंने सोचा एक शब्दकोश का उपयोग करके ऐसा करने का सही तरीका होगा (पाइथन ट्यूटोरियल पढ़ने के लगभग 3 घंटे के लायक) के आधार पर। क्या यह एक बेहतर तरकीब है?

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

# Create an empty dictionary 
allocationList = {} 

# Open file for reading 
with open("allocFile.txt") as fp: 
    for line in fp: 
     # Split the line into a list (using space as delimiter) 
     lineList = line.split(" ") 

     # Extract the number of bytes 
     numBytes = lineList[0]; 

     # Store in a dictionary 
     if allocationList.has_key('numBytes') 
      currentCount = allocationList['numBytes'] 
      currentCount += 1 
      allocationList['numBytes'] = currentCount 
     else 
      allocationList['numBytes'] = 1 

for bytes, count in allocationList.iteritems() 
    print bytes, "bytes -> ", count, " times" 
इस के साथ

, मैं 'has_key' में एक सिंटैक्स त्रुटि मिलती है: अब तक, मेरे कोड स्निपेट इस प्रकार है। मैंने जो भी उदाहरण देखा है, अब तक यह मानते हैं कि कुंजी पहले उपलब्ध हैं। मेरे मामले में, जब मैं इनपुट फ़ाइल को पार्स कर रहा हूं तो मैं केवल अपनी चाबियाँ प्राप्त कर सकता हूं।

(ध्यान दें कि मेरे इनपुट फ़ाइल विभिन्न चाबियों के सैकड़ों के साथ, लाइनों के हजारों में चला सकते हैं)

किसी भी मदद प्रदान कर सकते हैं के लिए धन्यवाद।

+0

के रूप में मैं देख आप 'numBytes' उद्धृत किया, हां, तो आप हमेशा स्थिर – dmitry

+0

की बात कर रहे हैं और आप 'अगर allocationList.has_key ('numBytes')' और 'else' के बाद लाइनों में पेट के छोड़े गए - यह होना चाहिए वाक्यविन्यास त्रुटि – dmitry

उत्तर

10

भाषा सीखना सिंटैक्स और मूल प्रकारों के बारे में है जितना मानक पुस्तकालय के बारे में है। पायथन में पहले से ही एक कक्षा है जो आपके कार्य को बहुत आसान बनाती है: collections.Counter

from collections import Counter 

with open("allocFile.txt") as fp: 
    counter = Counter(line.split()[0] for line in fp) 

for bytes, count in counter.most_common(): 
    print bytes, "bytes -> ", count, " times" 
+0

मुझे लगता है कि आपका उत्तर किसी भी व्यक्ति से कहीं अधिक सत्य है –

+2

+1: यदि आप केवल गिनती में रूचि रखते हैं, तो काउंटर 'जाने का रास्ता है। दूसरी ओर, ओपी ने लिखा: * अभी के लिए, मैं स्मृति पते के बारे में चिंतित नहीं हूं * --- मुझे लगता है कि उसे जल्दी या बाद में एक कस्टम समाधान की आवश्यकता हो सकती है जो 'काउंटर' से परे हो। –

+0

इस समाधान के लिए आपको बहुत बहुत धन्यवाद। मैंने कोशिश की, लेकिन यह काम नहीं किया। ऐसा इसलिए है क्योंकि काउंटर केवल पायथन> 2.7 के लिए उपलब्ध है, और मैं 2.6.4 का उपयोग कर रहा हूं। लेकिन यह मुझे ले गया: http://stackoverflow.com/questions/3594514/how-to-find-most-common-elements-of-a-list, और यहां मुझे अपनी समस्या का समाधान करने का एक तरीका मिला। लेकिन मैं इस जवाब को समाधान के रूप में चिह्नित कर रहा हूं, क्योंकि यह शायद समस्या को हल करने का सबसे अच्छा तरीका है। – Gautam

4

dictionnary की dict.has_key() विधि disappeared in python3 है, यह बदलने के लिए, कीवर्ड में उपयोग करें:

if numBytes in allocationList: # do not use numBytes as a string, use the variable directly 
    #do the stuff 

लेकिन आपके मामले में, आप भी जगह ले सकता है सभी

if allocationList.has_key('numBytes') 
      currentCount = allocationList['numBytes'] 
      currentCount += 1 
      allocationList['numBytes'] = currentCount 
     else 
      allocationList['numBytes'] = 1 
के साथ एक लाइन के साथ

get:

allocationList[numBytes] = allocationList.get(numBytes, 0) + 1 
+2

'setdefault' का उपयोग करके मान को दो बार सेट करने की आवश्यकता नहीं है; इसके बजाय 'dict.get' का उपयोग करें। –

+0

@ फ़र्डिनेंडबेयर: आप सही हैं, यह थोड़ी अधिक ओवरकिल थी और सेटडेफॉल्ट का उपयोग करने के लिए बेकार था। –

+0

हटाया गया है 'है_की' और 'इन' में इस्तेमाल किया गया। पारितोषिक के लिए धन्यवाद। मैं शायद कुछ पुराने ट्यूटोरियल पढ़ रहा था। – Gautam

1

आप निश्चित रूप से चर कुंजी के रूप में चर का उपयोग कर सकते हैं। हालांकि, आपके पास numBytes नामक एक चर है, लेकिन पाठ "numBytes" युक्त स्ट्रिंग का उपयोग कर रहे हैं - आप एक स्ट्रिंग स्थिर का उपयोग कर रहे हैं, चर नहीं। इससे त्रुटि नहीं आएगी, लेकिन एक समस्या है। इसके बजाय, कोशिश करें:

if numBytes in allocationList: 
    # do stuff 

इसके अतिरिक्त, Counter पर विचार करें। जिस मामले को आप देख रहे हैं उसे संभालने के लिए यह एक सुविधाजनक वर्ग है।

4

आप क्योंकि आप इस पंक्ति के अंत में पेट के याद कर रहे हैं एक सिंटैक्स त्रुटि मिलती है:

if allocationList.has_key('numBytes') 
            ^

आपका दृष्टिकोण ठीक है, लेकिन यह एक डिफ़ॉल्ट मान के साथ dict.get() उपयोग करने के लिए आसान हो सकता है:

allocationList[numBytes] = allocationList.get(numBytes, 0) + 1 

चूंकि आपका allocationList एक शब्दकोश है और सूची नहीं है, तो आप चर के लिए एक अलग नाम चुनना चाहेंगे।

+0

धन्यवाद। मुझे ":" के बारे में कोई जानकारी नहीं थी। बस यह पता चला कि मुझे अपने 'के लिए' कथन के अंत में भी एक की आवश्यकता है। – Gautam

संबंधित मुद्दे