2016-09-16 91 views
-1

比方说,我有一本字典,像这样:更新/追加到词典

x = {'age': 23, 
    'channel': ['a'], 
    'name': 'Test', 
    'source': {'data': [1, 2]}} 

和一个类似像:

y = {'age': 23, 
    'channel': ['c'], 
    'name': 'Test', 
    'source': {'data': [3, 4], 'no': 'xyz'}} 

,如果我用这个x.update(y)我会失去'channel'例如以前的信息..如何在不同的时候添加值,并在字典中不存在时添加键值?

最终结果应该是:

{'age': 23, 
'channel': ['a', 'c'], 
'name': 'Test', 
'source': {'data': [1, 2, 3, 4], 'no': 'xyz'}} 

我差点与此:

for a,b in y.iteritems(): 
    try: 
     x[a] = x[a] + y[a] 
    except: 
     x[a] = y[a] 

但失败了的时候才发现字典内的字典。

+0

目前还不清楚你想用简单的字符串做什么。例如,如果'x ['name'] =='test1''和'y ['name'] =='test2'',你想成为什么样的结果? 'test1','test2'或'test1test2'?或者,就此而言,使用整数/浮点数。 –

+0

@PavelGurkov如果key/val是一样的:忽略 – Onilol

+0

但是key/val在那里不一样。 –

回答

2

你的要求似乎有点模糊,但你可以做你想做一个什么递归函数如下所示。 (要我明白你的要求的时候,你不能追加类型的字典权利或这些案件的喜欢?)

x = {'age': 23, 
    'channel': ['a'], 
    'name': 'Test', 
    'source': {'data': [1, 2], 'no': 'jj'}} 

y = {'age': 23, 
    'channel': ['c'], 
    'name': 'Test', 
    'source': {'data': [3, 4], 'no': 'xyz'}} 


def deep_update(x, y): 
    for key in y.keys(): 
     if key not in x: 
      x.update({key: y[key]}) 
     elif x[key] != y[key]: 
      if isinstance(x[key], dict): 
       x.update({key: deep_update(x[key], y[key])}) 
      else: 
       x.update({key: list(set(x[key] + y[key]))}) 
    return x 


print deep_update(x, y) 

{“源”:{“数据”: '':'jjxyz'},'age':23,'name':'Test','channel':['a','c']}

+0

它仍然在列表上复制=/ – Onilol

+0

@Onilol它不会附加两个列表同样的,是不是你的要求? x = {'source':{'data':[3,4]}},y = {'source':{'data':[3,4]}会产生{'source':{'data': [3,4]}},不重复。 – SpiXel

+0

https://repl.it/DdFZ请检查链接请 – Onilol

0

您可以访问相关的关键字的值并进行更改。 让我们已经采取了你的问题的字典例如:

x = {'name': 'Test', 'age': 23, 'channel': ['a'], 'source': {'data': [1,2]}} 
x['channel']=['a'] 

值是类型列表的[]。 可以追加或list.append()

所以添加值的列表,x['channel'].append('c')会给你:

{'age': 23, 'channel': ['a', 'c'], 'name': 'Test', 'source': {'data': [1, 2]}} 
+0

“source”呢? – Onilol

+0

只是第一种情况的延伸: –

+0

x ['source'] ['data']。append() –