字典推导,避免数据被覆盖
在输入方面,我有一个列表的列表,像这样:
[
['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)]})