在输入端,我有一个列表列表,如下所示
[
['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': [[]]}
即使每个名字只有一个列表。如果有多个同名的会员,则应添加其他列表,而不是覆盖现有列表。
这可以在字典理解中完成吗?
答案 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)]})