Python中的字典

时间:2009-03-10 17:34:44

标签: python dictionary

我正在努力加速使用字典。昨晚我花了三个小时在网上搜索类似于我想要做的一些事情的例子。例如,假设我有两个词典(实际上我有两个词典列表)。

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'

但如果他们这样做我似乎无法将这些值组合成一个列表。

除了对这个特定示例的直接回答之外,我将非常感谢有关使用词典的好例子的地方的任何建议。

9 个答案:

答案 0 :(得分:13)

试试这个:

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] )

答案 1 :(得分:6)

一个好的开始是获取iPython(easy_install ipython),然后选择标签,?dir

In [2]: dir {}
------> dir({})

Out[2]: 
['__class__',
 ...
 'keys',
 'pop',
 'popitem',
 'setdefault',
 'update',
 'values']

In [3]: {}.update?
Type:       dict
Base Class: <type 'dict'>
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]

(即“dict1中的每个键k,如果该键也在dict2中”) (另请注意,对字典成员资格的测试是O(1)操作,因此这将在O(| dict1 |)中运行)

编辑:好的,所以这并没有解决将两个dicts合并为一个列表的问题......但Lott的答案对此有好处,或者你可以使用{{1方法:

setdefault

答案 2 :(得分:4)

我相信这就是你想要的:

>>> d1={'key1':1, 'key2':2}
>>> d2={'key1':1, 'key2':'A', 'key4':4}
>>> d = {}
>>> d.update(d1)
>>> for i in d2:
        if i in d and d2[i] != d[i]:
            d[i] = [d[i], d2[i]]
        else:
            d[i] = d2[i]            
>>> d
{'key2': [2, 'A'], 'key1': 1, 'key4': 4}

答案 3 :(得分:2)

答案 4 :(得分:1)

如果您对该语言有任何经验,Python词典也可以像PHP中的关联数组一样工作。

Python文档中的内置类型页面也有一个很好的字典部分,该部分还有一个可用的函数列表:

http://docs.python.org/library/stdtypes.html#mapping-types-dict

答案 5 :(得分:0)

嗯,对于你的第一种情况,你可能想要一个帮助器,它将两个对象组合成两个对象的列表,两个列表组成一个列表,其中包含两个列表中的项目,

当然,这是假设您始终将密钥合并到列表中,但您不希望您的密钥最终成为“列表列表”

def listify( obj ): 
   if type(obj) != type([]): return [obj]
   else: return obj

def merge( v1, v2 ):
    return listify(v1) + listify(v2)

#so now you can merge two dictionaries:
dict1 = dict(a = 2, b = 5, c = 7 )
dict2 = dict(b = 4, d = 9, f = 10 )
dikt = {}

for k in set( dict1.keys() + dict2.keys() ):
    dikt[k] = merge( dict1.get(k, []), dict2.get(k, []) )
#resutls in:
# {'a': [2], 'c': [7], 'b': [5, 4], 'd': [9], 'f': [10]}

您可能会注意到,dict.keys()会返回一个键列表, set返回没有重复项的列表,因此set( d1.keys(), d2.keys() )返回d1和d2的键的并集

答案 6 :(得分:0)

@SilentGhost's answer的变体(所有其他答案产生错误的词典):

>>> d1 = dict(key1=1, key2=2)
>>> d2 = dict(key1=1, key2='A', key4=4)
>>> d = dict(d1)
>>> for k, v2 in d2.iteritems():
...     v = d.get(k, None)
...     d[k] = [v, v2] if v is not None and v != v2 else v2
...
>>> d
{'key2': [2, 'A'], 'key1': 1, 'key4': 4}

答案 7 :(得分:0)

这可能有点尴尬,因为您尝试创建的数据结构不是那么自然。例如,为什么不将所有内容保存在列表中,而不是将某些值设为单独的值,而将某些值设为列表? E.g。

{'key1': [1], 'key2': [2, 'A'], 'key4': [4]}

在Python中有可能拥有一组混合数据类型,但如果你保持一致,你的代码通常会更清晰。如果使用这种数据结构,插入就像

一样简单
# Inserting a (key, value) pair
if key in my_dict:
    my_dict[key].append(value)
else:
    my_dict[key] = [value]

答案 8 :(得分:0)

这是另一种变化。

d1 = {'key1'=1, 'key2'=2}
d2 = {'key1'=1, 'key2'='A', 'key4'=4)
d = d2
for k, v in d.iteritems():
... if k in d1.keys() and v!=d1[k]:
... d[k] = [d1[k], v2]
d
{'key2': [2, 'A'], 'key1': 1, 'key4': 4}