Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何将元组列表转换为字典,同时保留冗余值?_Python_List_Dictionary_Tuples - Fatal编程技术网

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