免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4756 | 回复: 7
打印 上一主题 下一主题

字典合并求助!要疯了! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-06-07 12:42 |只看该作者 |倒序浏览
合并两个嵌套字典:
dic1={'D:': {'Sony': {'Version': 250151506}, 'APP': {'Ecplise': {'workspace': {'Tripwire': {'test2': 9999999}}}}}}
dic2={'D:': {'APP': {'Ecplise': {'workspace': {'Tripwire': {'test1': 45648974423}}}}}}

合并后:
dic1={'D:': {'Sony': {'Version': 250151506}, 'APP': {'Ecplise': {'workspace': {'Tripwire': {'test2': 9999999,'test1':45648974423}}}}}}

想了很久,真的想不出来了,求助!!求代码!!!

论坛徽章:
0
2 [报告]
发表于 2013-06-07 13:54 |只看该作者
你这两个字典的结构不同,“APP"在第一个中是第二层,第二个中是第一层。请问你合并的规则是什么,否则很难用简单程序合并。

论坛徽章:
0
3 [报告]
发表于 2013-06-08 00:27 |只看该作者
回复 2# Hadron74


dic2是把一个文件的地址转换为嵌套字典,然后把这个字典再添加到dic1,dic1算是一个数据库吧
dic1里面的key是D: ,value是一个嵌套字典,那个字典的key是sony 和 app,然后又是一个嵌套字典

论坛徽章:
0
4 [报告]
发表于 2013-06-08 09:01 来自手机 |只看该作者
dic是手打的,少加了个{在app前面,其实app是第二层

论坛徽章:
0
5 [报告]
发表于 2013-06-08 13:45 |只看该作者
回复 4# yyr321677

简单写了个算法,是递归的。基本实现了你说的功能,没有做错误检查处理。
  1. dic1={'D:': {'Sony': {'Version': 250151506}, 'APP': {'Ecplise': {'workspace': {'Tripwire': {'test2': 9999999}}}}}}
  2. dic2={'D:': {'APP': {'Ecplise': {'workspace': {'Tripwire': {'test1': 45648974423}}}}}}

  3. def merge(a,b):
  4.     if type(a)== type({}) and type(b) == type({}):
  5.         ak = set(a.keys())
  6.         bk = set (b.keys())
  7.         c = ak & bk
  8.         d = ak - bk
  9.         e = bk - ak
  10.         fd = {}
  11.         for c0 in c:
  12.             fd[c0] = merge(a[c0],b[c0])
  13.         for d0 in d:
  14.             fd[d0] = a[d0]
  15.         for e0 in e:
  16.             fd[e0] = b[e0]
  17.         return fd

  18. print merge(dic1,dic2)
复制代码
结果:
{'D:': {'Sony': {'Version': 250151506}, 'APP': {'Ecplise': {'workspace': {'Tripwire': {'test1': 45648974423, 'test2': 9999999}}}}}}

   

论坛徽章:
0
6 [报告]
发表于 2013-06-09 08:19 |只看该作者
回复 5# Hadron74


    神人也。。
    我还没有学到set,研究研究。
    多谢多谢!

论坛徽章:
0
7 [报告]
发表于 2013-06-09 08:57 |只看该作者
回复 5# Hadron74

再厚颜相问一下
如果先从
dic1 = {'D:': {'Sony': {'Version': 250151506}, 'APP': {'Ecplise': {'workspace': {'Tripwire': {'test1': 45648974423, 'test2': 9999999}}}}}}
中,删除掉
dic2 = {'D:': {'APP': {'Ecplise': {'workspace': {'Tripwire': {'test1': 45648974423}}}}}}
该如何操作

如果一个Key的value变为了空,这个Key也要删除
确保最后的Dic1没有空的value
谢谢

论坛徽章:
0
8 [报告]
发表于 2013-11-13 14:01 |只看该作者
回复 7# yyr321677

试着写了一个,不知道是否满足你的要求。
  1. dic1={'D:': {'Sony': {'Version': 250151506}, 'APP': {'Ecplise': {'workspace': {'Tripwire': {'test2': 9999999}}}}}}
  2. dic2={'D:': {'APP': {'Ecplise': {'workspace': {'Tripwire': {'test1': 45648974423}}}}}}

  3. def merge(a,b):
  4.     if type(a)== type({}) and type(b) == type({}):
  5.         ak = set(a.keys())
  6.         bk = set(b.keys())
  7.         c = ak & bk
  8.         d = ak - bk
  9.         e = bk - ak
  10.         fd = {}
  11.         for c0 in c:
  12.             fd[c0] = merge(a[c0],b[c0])
  13.         for d0 in d:
  14.             fd[d0] = a[d0]
  15.         for e0 in e:
  16.             fd[e0] = b[e0]
  17.         return fd

  18. dic3 = merge(dic1,dic2)

  19. def delete(a,b):
  20.     if type(a) == type({}) and type(b) == type({}):
  21.         ak = set(a.keys())
  22.         bk = set(b.keys())
  23.         c = ak & bk
  24.         d = ak - bk
  25.         e = bk - ak
  26.         fd = {}
  27.         for c0 in c:
  28.             fd[c0] = delete(a[c0],b[c0])
  29.             if len(fd[c0]) == 0 :
  30.                 del fd[c0]
  31.         for d0 in d:
  32.             fd[d0] = a[d0]
  33.         for e0 in e:
  34.             raise ValueError("The dic B not in dic A")
  35.         return fd
  36.     return {}

  37. print dic2
  38. print dic3
  39. print delete(dic3,dic2)
复制代码
结果:
  1. {'D:': {'APP': {'Ecplise': {'workspace': {'Tripwire': {'test1': 45648974423}}}}}}
  2. {'D:': {'Sony': {'Version': 250151506}, 'APP': {'Ecplise': {'workspace': {'Tripwire': {'test1': 45648974423, 'test2': 9999999}}}}}}
  3. {'D:': {'Sony': {'Version': 250151506}, 'APP': {'Ecplise': {'workspace': {'Tripwire': {'test2': 9999999}}}}}}
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP