2016-10-12 45 views
-1

我想创建一个字典,其中相同的键可以有一个数组中的不同值。在过去,我在列表的每个列表上创建了一个包含位置的字典,但是我发现了一个错误,即同一个键可能具有多个值,并且会破坏主代码。 即。在python中使用defaultdict 2.7

my_array = [['a','b','c'],['a','e','d'],['f','g','h']] 
my dict = dict([p[0], p[2]] for p in my_array) 
my dict = {'a': 'c', 'f': 'h'} 
What I need is: 
my_dict = {'a': ['c','d'], 'f': 'h'} 

我试着用defaultdict,但到目前为止我得到TypeError异常。我曾尝试初始化它作为一个字符串defaultdict(STR)和一个列表defaultdict(列表),但没有成功

my_dict = defaultdict((my_dict[p[0]].append(p[2])) for p in my_array) 
or 
my_dict = defaultdict(([p[0], p[2]]).append(p[2]) for p in a_array) 

始终得到TypeError异常,建议好吗?

+0

你需要的是[multidict](https://pypi.python.org/pypi/multidict)。 –

+0

请不要为此使用multidict。下面提供的解决方案正是您所需要的。 – idjaw

回答

2

你不能用理解/发电机表达式做到这一点。相反,试试这个:

my_dict = {} 
for p in my_array: 
    my_dict.setdefault(p[0], []).append(p[2]) 

你也可以做一个defaultdict如果你坚持,但似乎矫枉过正:

​​

所有你的价值观现在将列出,即使它们只包含一个单一的项目,根据你的问题,这似乎不是你想要的。它可能实际上是,因为处理总是相同类型的值更容易。但是,如果你想列出的外单值,我觉得最简单的方法是构建字典之后进行后处理和转换单项列出回单值:

for k, v in my_dict.iteritems(): # n.b. just .items() in Python 3 
    if len(v) == 1: 
     my_dict[k] = v[0] 

否则,你最终必须在添加新字典时检查字典中每个值的类型,并在添加第二个值时将该值转换为列表。

+0

就像一个魅力!谢谢 –

2

defaultdict构造函数需要一个可调用它将作为任何未定义的键的默认值。在你的情况下,默认值只是一个list

此代码你想要做什么:

from collections import defaultdict 
my_dict = defaultdict(list) 
for p in [['a','b','c'],['a','e','d'],['f','g','h']]: 
    my_dict[p[0]].append(p[2]) 
my_dict = dict(my_dict)