Dict理解,避免数据被覆盖

时间:2014-07-18 09:03:35

标签: python dictionary

在输入端,我有一个列表列表,如下所示

[
  ['name1', 1,2,3,4],  # name, val1, val2, val3, val4
  ['name2', 4,3,6,2],
  ['name3', 9,6,4,9],
  ['name1', 10,3,12,4],
  ['name2', 1,4,3,2]
]

然后转换为namedtuple(上面的名称)。要把它转换为dict,我试过

result = {data.name: data for data in data_list}

但是当再次出现相同的名称时会覆盖该条目。我想要实现的是,键/值总是

{'name': [[]]}

即使每个名字只有一个列表。如果有多个同名的会员,则应添加其他列表,而不是覆盖现有列表。

这可以在字典理解中完成吗?

1 个答案:

答案 0 :(得分:3)

这可以在词典理解中完成吗? ,除非您想对数据进行额外的排序和分组。这将窃取代码的可读性,而且不值得努力

<强>实施

from operator import itemgetter
from itertools import groupby    
{ k : zip(*zip(*v)[1:])
      for k, v in groupby(sorted(data, key = itemgetter(0)), key = itemgetter(0))}

<强>输出

{'name1': [(1, 2, 3, 4), (10, 3, 12, 4)],
 'name2': [(4, 3, 6, 2), (1, 4, 3, 2)],
 'name3': [(9, 6, 4, 9)]}

对于此类情况,您需要使用defaultdict

<强>实施

data = [
  ['name1', 1,2,3,4],  # name, val1, val2, val3, val4
  ['name2', 4,3,6,2],
  ['name3', 9,6,4,9],
  ['name1', 10,3,12,4],
  ['name2', 1,4,3,2]
]
data_dict = defaultdict(list)
for elem in data:
    data_dict[elem[0]].append(elem[1:])

<强>输出

defaultdict(<type 'list'>, 
{'name1': [(1, 2, 3, 4), (10, 3, 12, 4)],
 'name2': [(4, 3, 6, 2), (1, 4, 3, 2)],
 'name3': [(9, 6, 4, 9)]})