字典推导,避免数据被覆盖

1 投票
1 回答
529 浏览
提问于 2025-04-18 13:49

在输入方面,我有一个列表的列表,像这样:

[
  ['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]
]

然后我把它转换成了命名元组(上面提到的名字)。为了把它转换成字典,我尝试了:

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

但是这样做会在同样的名字出现时覆盖之前的条目。我想要实现的是,键/值总是

{'name': [[]]}

即使每个名字只有一个列表。如果同一个名字出现多次,应该把额外的列表添加进去,而不是覆盖已有的列表。

这样可以通过字典推导式来实现吗?

1 个回答

4

这可以用字典推导式来做吗?不可以,除非你愿意多花时间去排序和分组数据。这样会让代码变得不容易读,付出的努力不值得。

实现方式

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)]})

撰写回答