2017-09-16 92 views
1

我有一個像數據結構;轉換的元組列表到字典

data = [ 
    ('di', 'c1', 'avg11'), 
    ('di', 'c2', 'stdev12'), 
    ('eng', 'c1', 'stdev21'), 
    ('eng', 'c2', 'stdev22') 
] 

如何獲得'di''eng'物品進入字典它看起來像這樣的元組的列表:

data1 = {'c1':'avg11','c2':'stdev12'} 

data2 = {'c1':'stdev21','c2':'stdev22'} 

使用熊貓或numpy的還是普通的python?

+1

爲什麼單獨的變量名?爲什麼不只是一個帶有'di''和''eng''鍵的頂級字典? –

回答

2

使用Pandas你可以做

In [660]: data1, data2 = pd.DataFrame(data).set_index([0, 1]).unstack()[2].to_dict('r') 

In [661]: data1 
Out[661]: {'c1': 'avg11', 'c2': 'stdev12'} 

In [662]: data2 
Out[662]: {'c1': 'stdev21', 'c2': 'stdev22'} 

In [663]: pd.DataFrame(data).set_index([0, 1]).unstack()[2].to_dict('r') 
Out[663]: [{'c1': 'avg11', 'c2': 'stdev12'}, {'c1': 'stdev21', 'c2': 'stdev22'}] 
0

使用普通的Python,你可以做使用

def process_data(data): 
    res = {} 

    for itm in data: 
     if itm[0] not in res: 
      res[itm[0]] = {} 
     res[itm[0]][itm[1]] = itm[2] 
    return res 

例子:

>>> d = [ 
...  ('di', 'c1', 'avg11'), 
...  ('di', 'c2', 'stdev12'), 
...  ('eng', 'c1', 'stdev21'), 
...  ('eng', 'c2', 'stdev22') 
... ] 
>>> print(process_data(d)) 
{'eng': {'c2': 'stdev22', 'c1': 'stdev21'}, 'di': {'c2': 'stdev12', 'c1': 'avg11'}} 
+0

不要使用'dict.get()'來測試密鑰的存在;這只是浪費週期,因爲你返回值或'None',然後再次丟棄它。只需在'res'中使用'itm [0]。 –

+0

你是對的,謝謝 – OlegWock

+0

更好地使用'itm [0]不在res'(是的,我的錯誤) –

2

在純Python,只是建立一個頂級字典,使用dict.setdefault()物化嵌套字典,如果仍然丟失:

result = {} 
for outer, inner, value in data: 
    result.setdefault(outer, {})[inner] = value 

這是分組數據的最簡單和更可讀的方式。

演示:

>>> data = [ 
...  ('di', 'c1', 'avg11'), 
...  ('di', 'c2', 'stdev12'), 
...  ('eng', 'c1', 'stdev21'), 
...  ('eng', 'c2', 'stdev22') 
... ] 
>>> result = {} 
>>> for outer, inner, value in data: 
...  result.setdefault(outer, {})[inner] = value 
... 
>>> result 
{'di': {'c1': 'avg11', 'c2': 'stdev12'}, 'eng': {'c1': 'stdev21', 'c2': 'stdev22'}} 

如果必須已經data1data2變量之後,只需設置那些來自'di''eng'鍵:

data1 = result['di'] 
data2 = result['eng'] 

但這是相當不靈活,如果你有更多或更少或不同的外鍵。

+0

我假設這是'defaultdict(dict)'的替代方案。它比它有優勢嗎? – ayhan

+1

@ayhan:你可以控制什麼時候丟失的鍵產生一個值;一個'defaultdict(dict)'總是使用工廠,而'dict.setdefault()'明確表示。 –

0

隨着itertools.groupby()功能:

import itertools 

data = [ 
    ('di', 'c1', 'avg11'), ('di', 'c2', 'stdev12'), 
    ('eng', 'c1', 'stdev21'), ('eng', 'c2', 'stdev22') 
] 
result = {k: {i[1]:i[2] for i in g} 
      for k,g in itertools.groupby(sorted(data), key=lambda x: x[0])} 
print(result) 

輸出:

{'di': {'c1': 'avg11', 'c2': 'stdev12'}, 'eng': {'c1': 'stdev21', 'c2': 'stdev22'}}