2016-03-30 34 views
2

我對Python很新,想知道下面問題的某種解決方案。從Python中的字典的現有列表字典的列表

original_list = [{'Table':'A', 'Column':'C1','Data_Type':'int','Column_Style':None, 'others':'O1'}, 
       {'Table':'A', 'Column':'C2', 'Data_Type':'varchar','Column_Style': '20','others':'O2'}, 
       {'Table':'A', 'Column':'C2', 'Data_Type':'numeric','Column_Style': '10,2','others':'O3'} 
       ] 

我想返回字典的一個列表,其中的關鍵是在['Table', 'Data_Type', 'Column']Data_Type值是Data_TypeColumn_Style合併的值。

# expecting output like below 
new_list = [{'Table':'A', 'Column':'C1', 'Data_Type':'int'}, 
      {'Table':'A', 'Column':'C2', 'Data_Type':'varchar(20)'}, 
      {'Table':'A', 'Column':'C2', 'Data_Type':'numeric(10,2)'} 
      ] 

回答

1
new_list = [] 
for innerDict in original_list: 
    newDict = {} 
    for key in innerDict: 
     if key not in ['Data_Type', 'Column_Style', 'others']: 
      newDict[key] = innerDict[key] 
     elif key == 'Data_Type': 
      if innerDict['Column_Style']: 
       newDict['Data_Type'] = innerDict['Data_Type'] + '(' + innerDict['Column_Style'] + ')' 
      else: 
       newDict['Data_Type'] = innerDict['Data_Type'] 
    new_list.append(newDict) 

new_list將包含你的要求,假設original_list是因爲你在上面提供它的輸入列表輸出。

+0

測試解決方案,它爲我工作。 – Igor

+0

謝謝!這解決了我的問題! @ cn04 – Pradeep

1

其實你可以使用生成函數產生配合您的每一個元素的標準在字典中的原始列表,一個字典

def gen_dict(ori_dict_list): 
    columns = ['Table', 'Data_Type', 'Column'] 
    for element in ori_dict_list: 
     d = {} 
     for field in columns: 
      if field == 'Data_Type': 
       if element['Column_Style'] is None: 
        d['Data_Type'] = element['Data_Type'] 
       else: 
        d['Data_Type'] = "{}({})".format(element['Data_Type'], element["Column_Style"]) 
      else: 
       d[field] = element[field] 
     yield d 

演示:

>>> from pprint import pprint # Just to pretty print nothing special 
>>> pprint(list(gen_dict(original_list))) 
[{'Column': 'C1', 'Data_Type': 'int', 'Table': 'A'}, 
{'Column': 'C2', 'Data_Type': 'varchar(20)', 'Table': 'A'}, 
{'Column': 'C2', 'Data_Type': 'numeric(10,2)', 'Table': 'A'}] 
+0

你聽起來像是一個更高級的pythoneer。對我來說,代碼看起來與@ cn04非常相似。你能解釋爲什麼這樣更好嗎?我讀的關於發生器的小內容是他們更高效的內存。 – Igor