2017-06-29 131 views
4

我是Python新手,我正在學習操縱字典。我有一個具有以下結構的字典:列表解析字典值

dict = {'city1':([1990, 1991, 1992, 1993],[1.5,1.6,1.7,1.8]), 
     'city2':([1993, 1995, 1997, 1999],[2.5,3.6,4.7,5.8]) 

我想通過值轉換的關鍵在以下方式

'city': ([1990, 1.5],[1991, 1.6],[1992,1.7],[1993,1.8]) 

我試圖用一個for循環中循環,並創建一個新的每個鍵的值。但是,這看起來非常緩慢和笨拙。有沒有達到這個目標的Pathonic方法?

謝謝!

回答

1

這給你正是輸出你想要的:

d = { k : tuple(map(list, zip(*d[k]))) for k in d } 

輸出:

{'city2': ([1993, 2.5], [1995, 3.6], [1997, 4.7], [1999, 5.8]), 'city1': ([1990, 1.5], [1991, 1.6], [1992, 1.7], [1993, 1.8])} 

另外,不要認爲比dict不同的名稱,因爲這是名稱的內置dict類。


zip(*d[k])zip(d[k][0], d[k][1])一個簡化版本,但他們都做同樣的事情,產生成對的元組。

map(list, ...)生成在zip每個元素轉換成一個列表(在python2元組被自動轉換爲列表)

tuple(...)map列表/發電機轉換爲列表的元組的地圖對象,這正是你要。

+0

感謝zip()的解釋!現在對我來說更有意義。 – macintosh81

3

你可以試試這個:

d = {'city1':([1990, 1991, 1992, 1993],[1.5,1.6,1.7,1.8]), 
    'city2':([1993, 1995, 1997, 1999],[2.5,3.6,4.7,5.8])} 

new_dict = {a:tuple(map(list, zip(b[0], b[1]))) for a, b in d.items()} 

輸出:

{'city2': ([1993, 2.5], [1995, 3.6], [1997, 4.7], [1999, 5.8]), 'city1': ([1990, 1.5], [1991, 1.6], [1992, 1.7], [1993, 1.8])} 
+0

感謝您的回答!它快速而整潔地解決了我的問題。 – macintosh81

+0

很高興能幫到你! – Ajax1234

3

你可以試試下面的代碼

a = [[a, b] for a, b in zip(dict['city1'][0], dict['city1'][1])] 

輸出

[[1990, 1.5], [1991, 1.6], [1992, 1.7], [1993, 1.8]] 
1

一種方法是使用這種簡潔的解決方案:

res = {k: zip(v[0], v[1]) for k, v in d.items()} 

輸出:

>>> {k: zip(v[0], v[1]) for k, v in d.items()} 
{'city2': [(1993, 2.5), (1995, 3.6), (1997, 4.7), (1999, 5.8)], 'city1': [(1990, 1.5), (1991, 1.6), (1992, 1.7), (1993, 1.8)]} 
+0

這將生成*元組*。 –

+0

感謝您的評論!是的,它生成元組列表,但我認爲它也適用於OP。 – ettanany

+1

非常整潔的解決方案!感謝您的輸入! – macintosh81

1

我只是把我的答案,因爲我還沒有見過有誰拿還有for key, (year, value)的優勢。我覺得這相當的可讀性和直接

d = {'city1':([1990, 1991, 1992, 1993],[1.5,1.6,1.7,1.8]), 
    'city2':([1993, 1995, 1997, 1999],[2.5,3.6,4.7,5.8])} 

a = {k : [list(group) for group in zip(year, val)] for k, (year, val) in d.items()} 

enter image description here