Python 听写理解,避免数据被覆盖

Python 听写理解,避免数据被覆盖,python,dictionary,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

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

[
  ['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': [[]]}
即使每个名字只有一个列表。如果有多个同名的Accourence,则应添加其他列表,而不是覆盖现有列表


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

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

实施

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))}
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:])
输出

{'name1': [(1, 2, 3, 4), (10, 3, 12, 4)],
 'name2': [(4, 3, 6, 2), (1, 4, 3, 2)],
 'name3': [(9, 6, 4, 9)]}
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)]})
对于这种情况,您需要使用
defaultdict

实施

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))}
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:])
输出

{'name1': [(1, 2, 3, 4), (10, 3, 12, 4)],
 'name2': [(4, 3, 6, 2), (1, 4, 3, 2)],
 'name3': [(9, 6, 4, 9)]}
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)]})
defaultdict(,
{'name1':[(1,2,3,4),(10,3,12,4)],
‘名称2’:[(4,3,6,2),(1,4,3,2)],
'name3':[(9,6,4,9)])

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

实施

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))}
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:])
输出

{'name1': [(1, 2, 3, 4), (10, 3, 12, 4)],
 'name2': [(4, 3, 6, 2), (1, 4, 3, 2)],
 'name3': [(9, 6, 4, 9)]}
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)]})
对于这种情况,您需要使用
defaultdict

实施

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))}
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:])
输出

{'name1': [(1, 2, 3, 4), (10, 3, 12, 4)],
 'name2': [(4, 3, 6, 2), (1, 4, 3, 2)],
 'name3': [(9, 6, 4, 9)]}
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)]})
defaultdict(,
{'name1':[(1,2,3,4),(10,3,12,4)],
‘名称2’:[(4,3,6,2),(1,4,3,2)],
'name3':[(9,6,4,9)])

我删除了-1,尽管你应该关注为什么不能通过听写理解来完成它。@freakish:我个人不这么认为;I don’我不认为不发表评论就投反对票是一个好办法,因为这不会增加任何价值。如果您认为答案可以改进,请留下评论,以便回答者可以回来修改:-)我想发表评论,但您同时编辑了您的答案。另外,我也在评论另一个答案。所以这只是一个巧合,不是我的恶意。@freakish:而且我认为我在一个不断发展的答案中看到的许多受访者的一般方法。因此,如果你现在看到答案,它既回答了问题,也提供了最佳建议practice@Abhijit当前位置“非听写理解”方式是我实际使用的方式。我很感兴趣的是它是否也可以在理解中完成。我删除了-1,尽管你应该关注为什么不能通过dict理解来完成。@freakish:我个人不知道;I don’我不认为不发表评论就投反对票是一个好办法,因为这不会增加任何价值。如果您认为答案可以改进,请留下评论,以便回答者可以回来修改:-)我想发表评论,但您同时编辑了您的答案。另外,我也在评论另一个答案。所以这只是一个巧合,不是我的恶意。@freakish:而且我认为我在一个不断发展的答案中看到的许多受访者的一般方法。因此,如果你现在看到答案,它既回答了问题,也提供了最佳建议practice@Abhijit当前位置“非听写理解”方式是我实际使用的方式。我很感兴趣的是它是否也可以在理解中完成。这个问题似乎很常见,我希望看到一个标准库实现。这个问题似乎很常见,我希望看到一个标准库实现。