2013-05-10 9 views
221

क्या कोई नया नाम नहीं है और पुराने नाम की कुंजी को हटाए बिना किसी कुंजीपटल कुंजी का नाम बदलने का कोई तरीका है; और dict कुंजी/मूल्य के माध्यम से पुनरावृत्त किए बिना?

ऑर्डर्ड डिक्ट के मामले में, उस कुंजी की स्थिति को रखते हुए, वही करें।एक शब्दकोश कुंजी का नाम बदलें

+5

वास्तव में क्या आप एक नया नाम करने के लिए अपने मूल्य फिर नियत और पुराने नाम कुंजी को हटाए बिना द्वारा "मतलब है "? जिस तरह से मैं इसे देखता हूं, वह एक कुंजी का नाम बदलने की परिभाषा है, और नीचे दिए गए सभी उत्तरों मान को पुन: असाइन करते हैं और पुराने कुंजी नाम को हटाते हैं। आपने अभी तक एक जवाब स्वीकार नहीं किया है, तो शायद आपने जो कुछ भी खोजा है वह पूरा नहीं किया है? – dbliss

उत्तर

14

इस तरह newkey!=oldkey का एक चेक का उपयोग करके आप कर सकते हैं:

if newkey!=oldkey: 
    dictionary[newkey] = dictionary[oldkey] 
    del dictionary[oldkey] 
412

एक नियमित dict के लिए, आप उपयोग कर सकते हैं:

mydict[new_key] = mydict.pop(old_key) 

एक OrderedDict के लिए, मुझे लगता है कि आप एक पूरी तरह से निर्माण करना होगा एक समझ का उपयोग कर नया।

>>> OrderedDict(zip('123', 'abc')) 
OrderedDict([('1', 'a'), ('2', 'b'), ('3', 'c')]) 
>>> oldkey, newkey = '2', 'potato' 
>>> OrderedDict((newkey if k == oldkey else k, v) for k, v in _.viewitems()) 
OrderedDict([('1', 'a'), ('potato', 'b'), ('3', 'c')]) 

, कुंजी खुद को संशोधित करने के रूप में इस सवाल पूछने जा रहा है, अव्यावहारिक है क्योंकि dict कुंजी आमतौर पर इस तरह की संख्या, तार या tuples के रूप में अपरिवर्तनीय वस्तुओं रहे है। कुंजी को संशोधित करने का प्रयास करने के बजाय, मान को एक नई कुंजी पर पुन: असाइन करना और पुरानी कुंजी को हटाने का तरीका यह है कि आप पाइथन में "नाम बदलें" कैसे प्राप्त कर सकते हैं।

+0

पायथन 3.5 के लिए, मुझे लगता है कि 'dict.pop' मेरे परीक्षण के आधार पर ऑर्डर्ड डिक्ट के लिए काम करने योग्य है। – Daniel

+1

नहीं, 'ऑर्डरर्ड डिक्ट' सम्मिलन आदेश को सुरक्षित रखेगा, जो कि सवाल के बारे में नहीं पूछा गया है। – wim

+0

आप सही हैं, मेरी गलती। – Daniel

7

आप इस OrderedDict recipe रेमंड Hettinger द्वारा लिखित का उपयोग करें और एक rename विधि जोड़ने के लिए संशोधित कर सकते हैं, लेकिन यह एक हे (एन) जटिलता में होने जा रहा है:

def rename(self,key,new_key): 
    ind = self._keys.index(key) #get the index of old key, O(N) operation 
    self._keys[ind] = new_key #replace old key with new key in self._keys 
    self[new_key] = self[key] #add the new key, this is added at the end of self._keys 
    self._keys.pop(-1)   #pop the last item in self._keys 

उदाहरण:

dic = OrderedDict((("a",1),("b",2),("c",3))) 
print dic 
dic.rename("a","foo") 
dic.rename("b","bar") 
dic["d"] = 5 
dic.rename("d","spam") 
for k,v in dic.items(): 
    print k,v 

उत्पादन:

OrderedDict({'a': 1, 'b': 2, 'c': 3}) 
foo 1 
bar 2 
c 3 
spam 5 
+0

एक बहुत अच्छा दृष्टिकोण की तरह दिखता है, लेकिन मैं इसे अपनी स्क्रिप्ट में कैसे जोड़ सकता हूं? – MERose

+1

@MERose अपने मॉड्यूल खोज पथ में कहीं भी पाइथन फ़ाइल जोड़ें और इससे 'ऑर्डर्ड डिक्ट' आयात करें। लेकिन मैं अनुशंसा करता हूं: 'ऑर्डर्ड डिक्ट' से प्राप्त एक वर्ग बनाएं और इसमें 'नाम बदलें' विधि जोड़ें। –

37

1 लाइन में सबसे अच्छा तरीका:

>>> d = {'test':[0,1,2]} 
>>> d['test2'] = d.pop('test') 
>>> d 
{'test2': [0, 1, 2]} 
+2

क्या होगा यदि आपके पास 'd = {('test', 'foo') है: [0,1,2]}'? –

+1

@PetrFedosov, तो आप 'd [('new', 'key')] = d.pop (('test', 'foo')) ' –

+1

यह उत्तर wim के उत्तर के बाद _two__ आया था जो सटीक बताता है चीज, कोई अतिरिक्त जानकारी के साथ। मैं क्या खो रहा हूँ? –

0

मेरे सामने कुछ लोगों हटा सकते हैं और एक एक लाइनर में एक महत्वपूर्ण बनाने के लिए .pop चाल का उल्लेख किया।

मैं व्यक्तिगत रूप से अधिक स्पष्ट कार्यान्वयन अधिक पठनीय लगता है:

d = {'a': 1, 'b': 2} 
v = d['b'] 
del d['b'] 
d['c'] = v 

कोड ऊपर रिटर्न {'a': 1, 'c': 2}

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