【问题标题】:Create dictionary from list of lists. Append items to dictionary value if key exist从列表列表创建字典。如果键存在,则将项目附加到字典值
【发布时间】:2017-07-02 16:46:56
【问题描述】:

我有一个这样的列表:

 My_dict={0: ['Name1', 'value1', 'value2',  'value3'],
 1: ['Name2',  'value4', 'value5',  'value6'],
  2: ['Name1',  'value7', 'value8',  'value9']}

我需要从中创建另一个字典 - 将列表中的第一个值作为键,对于那些重复的键 - 将值附加到值列表。 我想看到的结果是:

New_dict= {'Name1': ['value1','value2','value3','value7','value8','value9'],
           'Name2': ['value4', 'value5',  'value6']}

现在我正在考虑将字典转换为列表列表并创建新字典(但我在创建新字典时会重写值)

lists=[]
My_dict={0: ['Name1', 'value1', 'value2',  'value3'],
 1: ['Name2',  'value4', 'value5',  'value6'],
  2: ['Name1',  'value7', 'value8',  'value9']}
for v in My_dict.items():
    lists.append(v[1])
new_dict={x[0]: x[1:] for x in lists}   

我应该在哪里添加 if 语句以验证我是否将值附加到 new_dict 中的现有键,而不是重写

【问题讨论】:

  • 顺序重要吗?列表中会有重复项吗?
  • 排序比较好,但不是那么重要。是的,可以有很多重复项

标签: python list python-3.x dictionary


【解决方案1】:

你可以使用collections.defaultdict:

>>> from collections import defaultdict
>>> d = defaultdict(list)
>>> for key in sorted(My_dict):
...     d[My_dict[key][0]].extend(My_dict[key][1:])
... 
>>> 
>>> dict(d)
{'Name1': ['value1', 'value2', 'value3', 'value7', 'value8', 'value9'], 'Name2': ['value4', 'value5', 'value6']}

在 Python 3.6 及更高版本中,如果您想处理插入顺序中的值,您可以省略 sorted() 并仅迭代 My_dict.values()

如果列表元素的顺序无关紧要或者您需要消除重复,您可以使用sets

>>> d = defaultdict(set);
>>> for value in My_dict.values():
...     d[value[0]] |= set(value[1:])
...
>>> dict(d)
{'Name1': {'value8', 'value3', 'value2', 'value1', 'value7', 'value9'}, 'Name2': {'value4', 'value5', 'value6'}}

【讨论】:

  • 如果订单很重要?将深入调查我正在尝试处理的数据,但提前感谢您的回答)
  • 哦,我找到了 >>> # 字典按值排序 >>> OrderedDict(sorted(d.items(), key=lambda t: t[1]))
猜你喜欢
  • 1970-01-01
  • 2020-04-09
  • 1970-01-01
  • 2022-01-06
  • 2021-03-09
  • 2010-12-14
  • 2019-07-05
  • 2017-11-15
  • 1970-01-01
相关资源
最近更新 更多