2012-10-31 19 views
6

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

[{'type_id': 6, 'type_name': 'Type 1'}, {'type_id': 12, 'type_name': 'Type 2'}] 

में

[{'type': 6, 'name': 'Type 1'}, {'type': 12, 'name': 'Type 2'}] 

(मैं आदेश एक API मैं पर काम कर रहा हूँ के लिए एक निर्गम विनिर्देश मिलान करने के लिए परिवर्तन करने की जरूरत है।) बदलना होगा

+0

"सर्वश्रेष्ठ" क्या उपाय है? ऐसा करने के कई तरीके हैं। पढ़ने में अासान? कम स्मृति? फास्ट? – Hamish

+0

अच्छा बिंदु। "सबसे पायथनिक" के बारे में कैसे? :) तो शायद कोड की सबसे कम लाइनों में, आसानी से पढ़ने के लिए झुकाव। मुझे लगता है कि आम तौर पर जब मुझे इस प्रकार के परिदृश्य का सामना करना पड़ता है, तो आमतौर पर कुछ शांत या रोचक अंतर्निहित पायथन कार्यक्षमता होती है जो इसे ब्रूट-फोर्स लूप लिखने के बजाय होती है, हालांकि मैं इसके लिए खुला हूं। सूची आम तौर पर 20 से कम शब्दकोशों से कम होगी, इसलिए स्मृति और गति मेरे लिए किसी समस्या का बड़ा नहीं है। –

+0

http://stackoverflow.com/questions/644178/how-do-i-re-map-python-dict-keys – Pramod

उत्तर

2

बस का उपयोग एक list comprehension

>>> d = [{'type_id': 6, 'type_name': 'Type 1'}, {'type_id': 12, 'type_name': 'Type 2'}] 
>>> print [{'type':x['type_id'],'name':x['type_name']} for x in d] 
[{'type': 6, 'name': 'Type 1'}, {'type': 12, 'name': 'Type 2'}] 
>>> 
+0

मैं हमेशा आश्चर्यचकित हूं कि आप सूची समझ के साथ कितना कर सकते हैं। –

8

अजगर> = 2.7 (का उपयोग कर एक dict comprehension):

transform = {"type_id": "type", "type_name": "name"} 
new_list = [{transform[k]: v for k, v in d.items()} for d in old_list] 

अजगर> = 2.4 (dict निर्माता का उपयोग कर):

transform = {"type_id": "type", "type_name": "name"} 
new_list = [dict((transform[k], v) for k, v in d.items()) for d in old_list] 
+0

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

1

नए उपयोगकर्ता के अनुकूल, आसान-टू-रीड रास्ता:

>>> list2 = [] 
>>> for d in list1: 
...  x = dict() 
...  for k,v in d.iteritems(): 
...  x[k.split('_')[1]] = v 
...  list2.append(x) 
... 
>>> list2 
[{'name': 'Type 1', 'id': 6}, {'name': 'Type 2', 'id': 12}] 
+0

वह 'k.split (' _ ') [0] 'होगा। –

3
inplace संशोधनों के बारे में

कैसे ?

>>> transform = {"type_id": "type", "type_name": "name"}  
>>> for D in L: 
    for k,k_new in transform.items(): 
     D[k_new] = D.pop(k)    
>>> L 
[{'type': 6, 'name': 'Type 1'}, {'type': 12, 'name': 'Type 2'}] 

या और भी बेहतर:

>>> for D in L: 
    for k,k_new in transform.items(): 
     value = D.pop(k,None) 
     if value is not None: 
      D[k_new] = value 
संबंधित मुद्दे