2017-09-16 87 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'}}