我正在努力加速使用字典。昨晚我花了三个小时在网上搜索类似于我想要做的一些事情的例子。例如,假设我有两个词典(实际上我有两个词典列表)。
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'
但如果他们这样做我似乎无法将这些值组合成一个列表。
除了对这个特定示例的直接回答之外,我将非常感谢有关使用词典的好例子的地方的任何建议。
答案 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)
以下是一些很好的链接:
http://www.diveintopython.org/getting_to_know_python/dictionaries.html
http://docs.python.org/tutorial/datastructures.html#dictionaries
答案 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}