Python 如何将元组列表转换为字典,同时保留冗余值?
我得到了一个格式化为键值对列表的数据集。键是数据源,值是数据元素。例如:Python 如何将元组列表转换为字典,同时保留冗余值?,python,list,dictionary,tuples,Python,List,Dictionary,Tuples,我得到了一个格式化为键值对列表的数据集。键是数据源,值是数据元素。例如: [('a', 3), ('b', 5), ('a', 7), ('c', 15), ('d', 12)] 我想把这张单子编成字典。我可以使用Python内置的dict(),但它会丢弃冗余值,只保留与给定键关联的最后一个值。我希望冗余值进入列表,如下所示: {'a': [3, 7], 'b': [5], 'c': [15], 'd': [12]} 有没有一个简单的方法来完成上述工作?我想一定有,但我似乎无法通过谷歌找到正
[('a', 3), ('b', 5), ('a', 7), ('c', 15), ('d', 12)]
我想把这张单子编成字典。我可以使用Python内置的dict()
,但它会丢弃冗余值,只保留与给定键关联的最后一个值。我希望冗余值进入列表,如下所示:
{'a': [3, 7],
'b': [5],
'c': [15],
'd': [12]}
有没有一个简单的方法来完成上述工作?我想一定有,但我似乎无法通过谷歌找到正确的提示。您可以使用字典的
setdefault()
方法:
d = {}
for key, value in my_list:
d.setdefault(key, []).append(value)
这也可以通过
defaultdict
完成。这两个选项中哪一个更可取取决于d
在其余代码中的使用方式。defaultdict
永远不会给您一个KeyError
,因此它可能会在代码中隐藏更深的错误。在集合
模块中的defaultdict
子类可用于在您第一次访问它时为每个键自动初始化一个新的列表
def multidict(lst):
result = collections.defaultdict(list)
for key, value in lst:
result[key].append(value)
return result # or dict(result) if you don't want to keep defaultdict
有了它,您只需在输入对之间循环,并将每个值附加到相应键的列表
,即可生成所需的值列表
import collections
data = [('a', 3), ('b', 5), ('a', 7), ('c', 15), ('d', 12)]
result = collections.defaultdict(list)
for key, value in data:
result[key].append(value)
print result
和都提供多目录实现。选择一个,并使用它 像这样
>>> d=[('a', 3), ('b', 5), ('a', 7), ('c', 15), ('d', 12)]
>>> f={}
>>> for k,v in d:
... f[k]=f.get(k,[])+[v]
...
>>> f
{'a': [3, 7], 'c': [15], 'b': [5], 'd': [12]}
请参见此处的第一个示例:Cool。直到今天我才知道
defaultdict
。我的python工具箱中又一把扳手f.setdefault(k,[])。append(v)
将比f[k]=f.get(k,[])+[v]
更简单。同意,它们几乎是等价的。@StevenRumbalski:使用setdefault()
的主要优点是它不会使代码变成O(n^2)。@user999346:不,它们是等价的。setdefault()
方法在列表创建后重用列表,而您的方法在每次添加项目时都将所有项目复制到一个新列表中。@user999346:将列表添加到列表中会创建一个新列表,然后将其分配回字典。随着列表中存储的值数量的增加,这将变得非常低效。
print result['a']
[3, 7]
print result['z']
[]
>>> d=[('a', 3), ('b', 5), ('a', 7), ('c', 15), ('d', 12)]
>>> f={}
>>> for k,v in d:
... f[k]=f.get(k,[])+[v]
...
>>> f
{'a': [3, 7], 'c': [15], 'b': [5], 'd': [12]}
from collections import defaultdict
l = [('a', 3), ('b', 5), ('a', 7), ('c', 15), ('d', 12)]
d = defaultdict(list)
for k, v in l:
d[k].append(v)
print d