2012-04-20 39 views
0

的字典列出的名單我已經列出的列表例如如何在以元組

res = [[None,'A','B'],[19980228, 'd1', 't1'],[19980302, 'd2', 't2'],[19980303, 'd3', 't3']] 

現在我需要幀以上結果作爲

字典元組的名單
{'A': [(19980228, 'd1'), (19980302, 'd2'), (19980303, 'd3')], 
'B': [(19980228, 't1'), (19980302, 't2'), (19980303, 't3')]} 

請讓我知道這個概念,在此先感謝。

回答

2

這應該這樣做:

x, A, B = res[0] 
output = {A:[], B:[]} 
for a,b,c in res[1:]: 
    output[A].append((a, b)) 
    output[B].append((a, c)) 
2
>>> res = [[None,'A','B'],[19980228, 'd1', 't1'],[19980302, 'd2', 't2'],[19980303, 'd3', 't3']] 
>>> {a:[(r[0], r[i]) for r in res[1:]] for i, a in enumerate(res[0]) if a} 
{'A': [(19980228, 'd1'), (19980302, 'd2'), (19980303, 'd3')], 'B': [(19980228, 't1'), (19980302, 't2'), (19980303, 't3')]} 

注:爲@shuzOMGchen指出,這是需要被在Python 2.7和3.0添加了「字典解析」,因此,如果您使用的是早期版本比你不得不稍微改變一下代碼。這是不使用字典理解(這是非常醜陋的,我只是想給我的邏輯從上面複製)

>>> res = [[None,'A','B'],[19980228, 'd1', 't1'],[19980302, 'd2', 't2'],[19980303, 'd3', 't3']] 
>>> d = {} 
>>> for i, a in enumerate(res[0]): 
...  if a: 
...   d[a] = [(r[0], r[i]) for r in res[1:]] 
... 
>>> d 
{'A': [(19980228, 'd1'), (19980302, 'd2'), (19980303, 'd3')], 'B': [(19980228, 't1'), (19980302, 't2'), (19980303, 't3')]} 
+0

它是如何工作的?等我想我得到它..這就是真的聰明! – aisbaa 2012-04-20 08:09:38

+1

請注意,這種技術利用了「字典理解」,這是一個在python 2.7和3.0中添加的功能,所以如果你在2.7之前,這將變得更加複雜。 字典理解在http://www.python.org/dev/peps/pep-0274/ – 2012-04-20 08:49:36

+0

@shuzOMGchen中有描述這是一個很好的觀點,我很習慣擁有他們,我甚至沒有想過。我已經在我的帖子中編輯了一個小警告,謝謝你的提示。 – 2012-04-20 14:40:25

0
>>> res = [[None,'A','B'],[19980228, 'd1', 't1'],[19980302, 'd2', 't2'],[19980303, 'd3', 't3']] 
>>> d = dict((x[0],x[1:]) for x in zip(*res)) 
>>> nums = d.pop(None) 
>>> for key in d: 
     d[key] = zip(nums,d[key]) 


>>> d 
{'A': [(19980228, 'd1'), (19980302, 'd2'), (19980303, 'd3')], 'B': [(19980228, 't1'), (19980302, 't2'), (19980303, 't3')]}