我正在努力加速使用词典.昨晚我花了三个小时在网上搜索类似于我想要做的一些事情的例子.例如,假设我有两个词典(实际上我有两个词典列表).
d1={key1:1, key2:2} d2={key1:1, key2:'A', key4:4}
我想更新d1所以它看起来如下所示:
d1={key1:1, key2:[2,'A'], key3:3, key4:4}
我似乎找不到足够的例子让我开始.我有相当数量的书籍,我也审查了它们,但它们似乎都有我在网上找到的相同类型的例子.
有没有人知道一个地方或一本书有明确的例子和如何使用字典的描述?
我认为我遇到的一个问题是我不理解在访问字典时如何维护引用.
我可以查看两个词典是否有共同的密钥:
for k in d1.keys(): for k2 in d2.keys(): if k==k2: print 'true'
但如果他们这样做我似乎无法将值组合成一个列表.
不仅仅是对这个特定例子的直接回答,我将非常感谢有关使用词典的好例子的地方的任何建议.
试试这个:
import collections merged = collections.defaultdict(list) for k in d1: merged[k].append( d1[k] ) for k in d2: merged[k].append( d2[k] )
这可能是你正在寻找的.
或者可能这样.
import collections merged = collections.defaultdict(set) for k in d1: merged[k].add( d1[k] ) for k in d2: merged[k].add( d2[k] )
一个好的开始是获取iPython(easy_install ipython
)然后选择Tab完成,?
并且dir
:
In [2]: dir {} ------> dir({}) Out[2]: ['__class__', ... 'keys', 'pop', 'popitem', 'setdefault', 'update', 'values'] In [3]: {}.update? Type: dict Base Class:String Form: {} Namespace: Interactive Length: 0 Docstring: dict() -> new empty dictionary. dict(mapping) -> new dictionary initialized from a mapping object's (key, value) pairs. dict(seq) -> new dictionary initialized as if via: d = {} for k, v in seq: d[k] = v dict(**kwargs) -> new dictionary initialized with the name=value pairs in the keyword argument list. For example: dict(one=1, two=2)
(仅举例)
无论如何,你检查两个字典之间常见的问题是有问题的:有几件事需要考虑(可能看看这个set
类?),但这是我怎么做的:
common_keys = [k for k in dict1 if k in dict2]
(即" k
dict1中的每个键,如果该键也在dict2中")(另请注意,对字典成员资格的测试是O(1)操作,因此这将在O(| dict1 |)中运行)
编辑:好的,所以这并没有解决将两个dicts合并为一个列表的问题......但是Lott的答案对此有好处,或者你可以使用这个setdefault
方法:
new = {} for (k, v) in dict1.items(): new.setdefault(k, []).append(v) for (k, v) in dict2.items(): new.setdefault(k, []).append(v)