2012-02-05 124 views
2

我有字典列表。我希望類型遍歷這個列表並將其映射到稍微不同類型的字典。將字典列表從一種類型映射到另一種字典

原詞典:

{'Test Name':blah, 'Test': blah, 'Att a': blah, 'Att b': blah} 

新字典:

{'Test Name':blah, 'Test': blah, 'Failure': failure, 'Project': project} 

在原來的我只在乎屬性測試名稱和測試。在新的詞典中,我添加了一些額外的屬性。

要做到這一點,我做的:

mappedFailures = []; 
for fixedFailure in fixedFailures: 
    mappedFailure = {'Test Suite': fixedFailure['Test Suite'], 
        'Test':fixedFailure['Test'], 'Failure':failure, 
        'Project': 'project'} 
    mappedFailures.append(mappedFailure); 

這是很容易閱讀,但我不知道有沒有一個更Python的方式感謝。

+3

Python 3包含dict comprehensions,它是爲這種用例設計的。請參閱http://www.python.org/dev/peps/pep-0274/ – 2012-02-05 20:54:29

+1

第一個「pythonic」要做的是放棄分號。 – 2012-02-05 23:12:57

回答

4

這是一個典型的用例列表理解:

def map_failure(ff): 
    return {'Test Suite': ff['Test Suite'], 'Test': ff['Test'], 
      'Failure': failure, 'Project': 'project'} 

mappedFailures = [map_failure(ff) for ff in fixedFailures] 
+0

定義一個方法來返回字典是否有任何特別的好處? – 2012-02-05 21:03:50

+1

@pcperini,總之,可讀性。 – senderle 2012-02-05 21:11:31

4

你可以使用列表中理解和dict constructor實現非常短

mappedFailures = dict((key, fixedFailure[key]) for key in ('Test Name', 'Test')) 
mappedFailures['Failure'] = failure 
mappedFailures['Project'] = project 
+3

真的不需要遍歷整個字典。你可以選擇你需要的鍵:'鍵入('鍵,固定失敗[鍵])('測試名稱','測試'))' – 2012-02-05 21:05:26

+0

你說得對。固定 – 2012-02-05 21:07:53

1

看來,mappedFailures居然是指令清單。爲此,您只需要使用列表理解來遍歷每個fixedFailure並從中構建一個新的字典。

mappedFailures = [ 
    { 
     'Test Name': fixedFailure['Test Name'], 
     'Test':  fixedFailure['Test'], 
     'Failure': failure, 
     'Project': project, 
    } 
    for fixedFailure in fixedFailures 
]