免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 6560 | 回复: 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
2 [报告]
发表于 2009-03-10 20:52 |只看该作者
看来cae是为了测试大家如何更好的使用字典.

论坛徽章:
0
3 [报告]
发表于 2009-03-10 21:06 |只看该作者
好变态的文本格式,假设文本格式
aaa:1234577
bbb:7685977
ddd:3468437777
eee:085433544
可以简单写成
dlist3={}
def a(f,d):
    for line in open(f,'r'):
        (k,v)=line.strip().split(':')
        if d.has_key(k):
            d[k]=d[k]+','+v
        else:
            d[k]=v
a('list1.txt',dlist3)
a('list2.txt',dlist3)
file3=open('list3.txt','w')
for k,v in dlist3.items():
    file3.write(k)
    file3.write(':')
    file3.write(v)
    file3.write('\n')

[ 本帖最后由 luffy.deng 于 2009-3-11 10:09 编辑 ]

论坛徽章:
0
4 [报告]
发表于 2009-03-11 09:36 |只看该作者

回复 #2 bohemia 的帖子

不敢当,那天看到腾讯招聘的一道考题,要求效果好像也是处理文件, 将这题一样归类,

改了一下楼上的代码,勉强能实现一下了:
#-*-coding=gbk-*-

dlist3={}
def a(f,d):
    for line in open(f,'r'):
        (k,v)=line.strip().split(':')
        print k
        print v
        if d.has_key(k):
            d[k]=d[k]+','+v
        else:
            d[k]=v
a('1.txt',dlist3)
a('2.txt',dlist3)
print dlist3
k=dlist3.items()
print k
g=open('3.txt','w+')
for i in k:
   g.writelines(':'.join(i))
   g.writelines('\n')
g.close

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

论坛徽章:
0
5 [报告]
发表于 2009-03-11 09:41 |只看该作者
有啥麻烦的?两 个文件 读进来 遍历一次 结果 就出来了 。

[ 本帖最后由 luffy.deng 于 2009-3-11 09:46 编辑 ]

论坛徽章:
0
6 [报告]
发表于 2009-03-11 10:06 |只看该作者
原帖由 caesarok 于 2009-3-11 09:36 发表
不敢当,那天看到腾讯招聘的一道考题,要求效果好像也是处理文件, 将这题一样归类,

改了一下楼上的代码,勉强能实现一下了:
#-*-coding=gbk-*-

dlist3={}
def a(f,d):
    for line in open(f,'r'):
    ...

file3=open('list3.txt','w')
for k,v in dlist3.items():
    file3.write(k)
    file3.write(':')
    file3.write(v)
    file3.write('\n')

论坛徽章:
0
7 [报告]
发表于 2009-03-11 10:08 |只看该作者
原帖由 caesarok 于 2009-3-11 09:36 发表
不敢当,那天看到腾讯招聘的一道考题,要求效果好像也是处理文件, 将这题一样归类,

for i in k:
   g.writelines(':'.join(i))
   g.writelines('\n')
    ...

':'.join(i)完全是多余的擦作
g.write(':')
g.write(i)
不就行了,多做一次字符串连接有啥好处?

论坛徽章:
0
8 [报告]
发表于 2009-03-11 11:18 |只看该作者

回复 #7 luffy.deng 的帖子


  1. QUOTE:
  2. 原帖由 caesarok 于 2009-3-11 09:36 发表
  3. 不敢当,那天看到腾讯招聘的一道考题,要求效果好像也是处理文件, 将这题一样归类,

  4. for i in k:
  5.    g.writelines(':'.join(i))
  6.    g.writelines('\n')
  7.     ...
  8. ':'.join(i)完全是多余的擦作
  9. g.write(':')
  10. g.write(i)
  11. 不就行了,多做一次字符串连接有啥好处?
复制代码

喔, 但是我还不太明白哪里多余,麻烦再指教下,
刚才我试了一下,  i字符太多了write写不行,g.write(':')就乱了格式了

论坛徽章:
0
9 [报告]
发表于 2009-03-11 11:38 |只看该作者
原帖由 caesarok 于 2009-3-11 11:18 发表

QUOTE:
原帖由 caesarok 于 2009-3-11 09:36 发表
不敢当,那天看到腾讯招聘的一道考题,要求效果好像也是处理文件, 将这题一样归类,

for i in k:
   g.writelines(':'.join(i))
   g.writelines('\n') ...

几位的思路给我启发很大,虽然本人水平不高,但是在这里本人不得不提点下,包括楼主在内的所以答题者,你们审题审清晰了吗?
"aaa":"12345",  这个是有逗号的
还有list1.txt  内容
            #姓名    #电话
        "aaa":"12345",
代表 双引号是文本的一部分

不能为了偷懒就随便设定啊
下面是本人写的code借鉴了大家的经验写的。
f1=open("list1.txt",'w')
f1.write(""""aaa":"12345",\n"bbb":"76859",\n"ccc":"346843",\n\
"
eee":"0854335" """)
f1.close()

f2=open("list2.txt",'w')      
f2.write(""""aaa":"1234577",\n"bbb":"7685977",\n"ddd":"3468437777",\n\
"
eee":"085433544" """)
f2.close()

d={}
def dlist(fdir,li=[]):
    f=open(fdir,'r')
    for i in f:
        i=i.rstrip()
        li.append(i)
    f.close()
    for i in li:
        k,v=i[0:-1].split(':')
        if d.has_key(k) and d[k]!=v:
            d[k]=d[k]+','+v
        else:
            d[k]=v
dlist('list1.txt')
dlist('list2.txt')
d['"eee"']=d['"eee"']+'""'
fdli=d.items()
f=open('list3.txt','w')
for i in fdli:

    f.write(i[0]+' '+(i[1].replace(',',''))+' '+'\n')
f.close()
    

论坛徽章:
0
10 [报告]
发表于 2009-03-11 12:50 |只看该作者
Ruby版

  1. hash = {}

  2.   IO.foreach("list1.txt") do
  3.     |line|
  4.     line.chomp!
  5.    line.strip!
  6.    line.sub!(/\s+/,":")
  7.   
  8.     temp =line.split(/:/)
  9. hash[temp[0]] = temp[1]

  10.   end
  11. IO.foreach("list2.txt") do
  12.     |line|
  13.     line.chomp!
  14.    line.strip!
  15.    
  16.     temp =line.split(/:|\s/)
  17. if(hash.include?(temp[0]))
  18.    hash[temp[0]] = hash[temp[0]]<<temp[1]
  19. else
  20.    hash[temp[0]] = temp[1]
  21. end
  22. end
  23. hash.each_pair {
  24. |key,value|
  25. str = key +"\t" +value+"\r\n"
  26. File.new("line3.txt", 'a+').write(str)
  27.   
  28. }
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP