2011-08-20 17 views
5

की एक कुंजी को कुशलतापूर्वक बदलें, मैं dict की चाबियों को छोटे रूपों में बदलने की तलाश में हूं ताकि इसे तार में एक कॉम्पैक्ट रूप में भेजा जा सके। dict में एक नया आइटम बनाने और पुराने को हटाने के बजाय, कुंजी को अपडेट करने का कोई तरीका है?पाइथन dict

अब मैं क्या कर रहा हूँ:

>>> a = dict(long_key=None) 
>>> a.update_key('long_key', 'l') 

मैं dict के internals के अनिश्चित हूँ:

>>> a = dict(long_key=None) 
>>> a['l'] = a['long_key'] 
>>> del a['long_key'] 

मैं करना चाहते हैं क्या कुछ इस तरह है। हालांकि, ऐसा लगता है कि update_key जैसी कुछ पुरानी कुंजी को हटाने की आवश्यकता से बचने में सक्षम हो सकती है।

+0

क्या आप अंतरिक्ष दक्षता, समय दक्षता या कोड लालित्य की तलाश में हैं? – Claudiu

+7

आपके परिवहन को संपीड़ित करना संभवतया आपके डेटा को खराब करने से एक सैनर समाधान है। –

+2

बस दृष्टिकोण के बारे में आलोचनाओं का जवाब देने के लिए- मैंने सवाल पूछा क्योंकि मुझे पाइथन 'dict' कैसे काम करता है, इस बारे में सीखने में दिलचस्पी है। ये छोटे स्निपेट मैं जो कुछ भी कर रहा हूं उसका प्रतिनिधित्व नहीं करता हूं, वे सिर्फ प्रश्न को स्पष्ट करने के लिए अपने इरादों का प्रदर्शन करने के लिए काम करते हैं। आधार पर एक क्यू को डाउनवॉट करना कि आपको इसकी विषय वस्तु पसंद नहीं है थोड़ा सा छोटा है। प्रश्नों को कम किया जाना चाहिए क्योंकि वे अस्पष्ट या अस्पष्ट हैं। –

उत्तर

3

एक और अधिक सुरुचिपूर्ण समाधान एक नया शब्दकोश बनाने के लिए हो सकता है ... अनिवार्य रूप से एक अलग उथले प्रतिलिपि बनाने:

a_send = dict((k[0], v) for k,v in a.items()) 

कि निश्चित रूप से हो जाएगा कम जगह-कुशल, हालांकि - आप अंतरिक्ष दक्षता के लिए देख रहे हैं , समय दक्षता, या कोड लालित्य?

+0

कुछ के रूप में स्वीकार किए जाने के रूप में चिह्नित जनरेटर अभिव्यक्ति का रूप शायद जाने का सबसे अच्छा तरीका है। –

1

आपको इसे कितनी बार भेजने की आवश्यकता है? हो सकता है कि कुछ भी बदलने के बजाय, आप केवल चाबियों को संसाधित कर सकते हैं जैसे आप जाते हैं?

short_dict = shorten_keys(long_dict) 
for k,v in short_dict: 
    send_over(k,v) 
कुछ

करते हैं:

इसके बजाय की तरह (अनुमान लगा छद्म कोड) कुछ करने का

for k,v in long_dict: 
    send_over(shorten(k),v) 

आप इसे कई बार भेजने के लिए है, तो आप भी का एक नक्शा बना सकते हैं लंबी -> छोटी चाबियाँ और भेजने के दौरान इसका इस्तेमाल करें। प्रतियां बनाने के लिए जगह/समय बर्बाद करना सबसे अच्छा समाधान नहीं हो सकता है।

0
longer = dict(long_key=None) 
mapping = dict(long_key='l') 
shorter = dict((mapping[k], v) for k,v in longer.iteritems()) 
3

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

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