免费注册 查看新帖 |

Chinaunix

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

|合并两个字典[增加难度版] [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-03-10 18:50 |只看该作者 |正序浏览
list1.txt  内容
            #姓名    #电话
        "aaa":"12345",
            "bbb":"76859",
            "ccc":"346843",
            "eee":"0854335"
            #姓名    #手机
list2.txt 内容
        "aaa":"1234577",
            "bbb":"7685977",
            "ddd":"3468437777",
            "eee":"085433544"

把两个文本txt合成 list3.txt
想合并后的效果如下:

#姓名     电话       手机
"aaa"         "12345 "      "1234577"
"bbb'         "76859"     " 7685977"
"ccc '         "346843"
"ddd "        " 3468437777"
"eee "        "0854335"   "085433544'

这个需要把list1与list2内容都读出来转化为字典类型, 再用集合进行处理.  如何弄,大伙都来指导指导!

(从 http://bbs3.chinaunix.net/thread-1389486-1-1.html  演化增加难度.)

[ 本帖最后由 caesarok 于 2009-3-11 10:05 编辑 ]

论坛徽章:
0
29 [报告]
发表于 2009-03-16 10:16 |只看该作者
"""
Syntax: merge_info infiles outfile
Example:
>> merge_info list1.txt list2.txt list3.txt
"""
def file2dict(f, d):
        for line in f:
                striped = line.rstrip(',\n')
                name, phone = [i[1:-1] for i in striped.split(':', 1)]
                if d.setdefault(name, [phone]) != [phone]:
                        d[name].append(phone)
                       
def dict2file(d, f):
        for name in d:
                print >> f, "%s\t%s" % (name, ' '.join(d[name]))
               
if __name__ == '__main__':
        import sys
        in_files = sys.argv[1:-1]
        out_file = sys.argv[-1]

        res = {}
        for fname in in_files:
                try:
                        f = open(fname)
                except IOError:
                        print >> sys.stderr, "Fail to open file: '%s'" % fname
                        print >> sys.stderr, "'%s' will be ignored.'" % fname
                else:
                        file2dict(f, res)
                finally:
                        f.close()

        try:
                f = open(out_file, 'w')       
                dict2file(res, f)
        except IOError:
                print >> sys.stderr, "Fail file operation: '%s'" % out_file
        finally:
                f.close()

论坛徽章:
0
28 [报告]
发表于 2009-03-15 21:30 |只看该作者
没有理LS们。
也许已经有更好的了……

  1. #!/usr/bin/python
  2. import re;
  3. def make(txt):
  4.   tmp=open(txt);
  5.   get=re.compile(r'"(.*)":"(.*)"').findall;
  6.   x=tmp.readlines();
  7.   tmp.close();
  8.   return dict(map(lambda x:(x[0][0],x[0][1]),map(get,x)));
  9. def none(x,y):
  10.   try:
  11.     x[y];
  12.   except :
  13.     x[y]=None;
  14. d1=make('list1.txt');
  15. d2=make('list2.txt');
  16. keys=d1.keys();
  17. keys+=[i for i in d2.keys() if not i in keys];
  18. import sys;
  19. saveout=sys.stdout;
  20. sys.stdout=open('list3.txt','w');
  21. keys.sort();
  22. format= lambda x: x and ' '*7+('"%s"' % x)or '';
  23. for i in keys :
  24.   none(d1,i);
  25.   none(d2,i);
  26.   print '"%s"'%i+format(d1[i]),format(d2[i]);
  27. sys.stdout=saveout;
复制代码

调试通过。

论坛徽章:
0
27 [报告]
发表于 2009-03-13 08:57 |只看该作者
请文明用语,各位!

论坛徽章:
0
26 [报告]
发表于 2009-03-12 16:38 |只看该作者
原帖由 dreamerx2004 于 2009-3-12 16:32 发表



是我无聊还是那个bi.deng无聊?请你搞清楚好不好?难道你是他找来的帮手?一个地方来的??

本来你们吵你们的我不想介入,但是碰巧版主不在好机会啊 我也来参加一下。
你问我是哪里来的,我地球来的,你呢?
另外我可不是什么人的枪手,我长期泡这个论坛的,一天8个小时双休日休息。

论坛徽章:
0
25 [报告]
发表于 2009-03-12 16:32 |只看该作者
原帖由 zhenglxd 于 2009-3-12 16:04 发表

我觉得你蛮无聊的,还以为有什么新的方法可以学习,搞了半天。。。



是我无聊还是那个bi.deng无聊?请你搞清楚好不好?难道你是他找来的帮手?一个地方来的??

论坛徽章:
0
24 [报告]
发表于 2009-03-12 16:30 |只看该作者
原帖由 luffy.deng 于 2009-3-12 15:54 发表

对于你这种货色,什么时候用傻逼称呼都是不过时的。



老家哪里的?素质怎么这么低啊?

论坛徽章:
0
23 [报告]
发表于 2009-03-12 16:04 |只看该作者
原帖由 dreamerx2004 于 2009-3-12 15:49 发表



你是不是想问我为什么要提出使用Update?告诉你,因为有只叫什么什么“jiba.deng”的外地鸡在另外一个帖子里说update不能实现,不是我非要用update不可,你地明白?

我觉得你蛮无聊的,还以为有什么新的方法可以学习,搞了半天。。。

论坛徽章:
0
22 [报告]
发表于 2009-03-12 15:54 |只看该作者
原帖由 dreamerx2004 于 2009-3-12 15:49 发表



你是不是想问我为什么要提出使用Update?告诉你,因为有只叫什么什么“jiba.deng”的外地鸡在另外一个帖子里说update不能实现,不是我非要用update不可,你地明白?

对于你这种货色,什么时候用傻逼称呼都是不过时的。

[ 本帖最后由 luffy.deng 于 2009-3-12 15:58 编辑 ]

论坛徽章:
0
21 [报告]
发表于 2009-03-12 15:49 |只看该作者
原帖由 zhenglxd 于 2009-3-12 14:47 发表


我对你的描述的理解是这样的
d2.update(d1)
形成了一个 new d2

然后从文件重新读取 old d2

因为newd2 和 old d2 也是拥有相同的key 不同的value所以不能update的


如果你因为描述的关系想表达的 ...



你是不是想问我为什么要提出使用Update?告诉你,因为有只叫什么什么“jiba.deng”的外地鸡在另外一个帖子里说update不能实现,不是我非要用update不可,你地明白?

[ 本帖最后由 dreamerx2004 于 2009-3-12 15:51 编辑 ]
  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP