免费注册 查看新帖 |

Chinaunix

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

请教一个在列表或者字典中取值相加的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-03-18 14:56 |只看该作者 |倒序浏览
有两个文件,想实现第一个文件所列出名字,在第二个文件中获取信息,如果第二个文件中没有记录则返回 no hit.
其中第一个文件如下:
Sam
Tom
Billy
Fang
Yong
Bill

另外一个文件如下:
Sam,25
Sam,teacher
Sam,America
Tom,student
Tom,ITer
Billy,38
Billy,professor
Fang,famer
Yong,Phd

根据上述两个文件得到如下结果文件:
Sam, 25;teacher;America
Tom, student;ITer
Billy, 38;professor
Fang, famer
Yong, Phd
Bill, no hit

本来想用建立字典然后遍历取结果,可是字典同样的键只能对应一个值,没能实现。后来想构建列表,也没有运行出来。在此请教各位兄弟姐妹。

论坛徽章:
4
白羊座
日期:2013-11-05 10:26:09冥斗士
日期:2015-11-17 14:19:55白银圣斗士
日期:2015-11-17 15:13:0815-16赛季CBA联赛之新疆
日期:2016-04-01 09:10:58
2 [报告]
发表于 2014-03-18 17:30 |只看该作者
可以考虑使用字典中的值是列表的方式来组织数据。

论坛徽章:
11
技术图书徽章
日期:2014-03-01 14:44:34天蝎座
日期:2014-05-21 22:11:59金牛座
日期:2014-05-30 17:06:14
3 [报告]
发表于 2014-03-19 10:26 |只看该作者
回复 1# 雨久
印象中很久以前你也问过类似的问题,Python入门应该很快啊
  1. import io

  2. infile1 = io.StringIO(
  3. '''Sam
  4. Tom
  5. Billy
  6. Fang
  7. Yong
  8. Bill
  9. ''')

  10. infile2 = io.StringIO(
  11. '''Sam,25
  12. Sam,teacher
  13. Sam,America
  14. Tom,student
  15. Tom,ITer
  16. Billy,38
  17. Billy,professor
  18. Fang,famer
  19. Yong,Phd
  20. ''')


  21. def main():
  22.     name_db = {}
  23.     for line in infile2:
  24.         fields = line.rstrip().split(',')
  25.         if len(fields) == 2:
  26.             name_db.setdefault(fields[0], []).append(fields[1])
  27.     for line in infile1:
  28.         name = line.rstrip()
  29.         value = ';'.join(name_db[name]) if name in name_db else 'no hit'
  30.         print(name, value, sep=',')

  31. if __name__ == '__main__':
  32.     main()
复制代码
保存为test.py,执行:
  1. bash-3.2 $python --version
  2. Python 3.3.4
  3. bash-3.2 $python test.py
  4. Sam,25;teacher;America
  5. Tom,student;ITer
  6. Billy,38;professor
  7. Fang,famer
  8. Yong,Phd
  9. Bill,no hit
复制代码

论坛徽章:
0
4 [报告]
发表于 2014-03-19 12:17 |只看该作者
感谢timespace大神:wink::wink::wink:
平时没有努力学习啊,大神见笑了。
把代码改写如下,没有运行出来

import sys

def main():
    if len(sys.argv) != 4:
        sys.exit('usage: {} infile1 infile2 outfile'.format(sys.argv[0]))
   
    with open(sys.argv[1]) as in1, open(sys.argv[2]) as in2, open(sys.argv[3], 'w') as out:
        name_db = {}
        for line in in2:
            fields = line.rstrip().split(',')
            if len(fields) == 2:
                name_db.setdefault(fields[0], []).append(fields[1])
        for name in in1:
            name = name.rstrip()
            value = ';'.join(name_db[name]) if name in name_db else 'no hit'
            print >> out , name, ',',value

if __name__ == '__main__':
    main()

论坛徽章:
11
技术图书徽章
日期:2014-03-01 14:44:34天蝎座
日期:2014-05-21 22:11:59金牛座
日期:2014-05-30 17:06:14
5 [报告]
发表于 2014-03-19 13:11 |只看该作者
回复 4# 雨久
报什么错?贴出内容


   

论坛徽章:
0
6 [报告]
发表于 2014-03-19 13:18 |只看该作者
没有报错,只是除了no hit,其它的值都没有写进去,结果如下:

Sam
Tom
Billy
Fang
Yong
Bill, no hit

论坛徽章:
11
技术图书徽章
日期:2014-03-01 14:44:34天蝎座
日期:2014-05-21 22:11:59金牛座
日期:2014-05-30 17:06:14
7 [报告]
发表于 2014-03-19 14:05 |只看该作者
回复 6# 雨久
很容易就改为2.7版本的:
  1. from cStringIO import StringIO

  2. infile1 = StringIO(
  3. '''Sam
  4. Tom
  5. Billy
  6. Fang
  7. Yong
  8. Bill
  9. ''')

  10. infile2 = StringIO(
  11. '''Sam,25
  12. Sam,teacher
  13. Sam,America
  14. Tom,student
  15. Tom,ITer
  16. Billy,38
  17. Billy,professor
  18. Fang,famer
  19. Yong,Phd
  20. ''')

  21. def main():
  22.     name_db = {}
  23.     for line in infile2:
  24.         fields = line.rstrip().split(',')
  25.         if len(fields) == 2:
  26.             name_db.setdefault(fields[0], []).append(fields[1])
  27.     for line in infile1:
  28.         name = line.rstrip()
  29.         value = ';'.join(name_db[name]) if name in name_db else 'no hit'
  30.         print '{},{}'.format(name, value)   

  31. if __name__ == '__main__':
  32.     main()
复制代码
运行:
  1. bash-3.2 $python2.7 test.py
  2. Sam,25;teacher;America
  3. Tom,student;ITer
  4. Billy,38;professor
  5. Fang,famer
  6. Yong,Phd
  7. Bill,no hit
复制代码
如果参考这个,还得不出结果,坦白说你不适合用Python,换个方向吧,可能更有效率。

   

论坛徽章:
0
8 [报告]
发表于 2014-03-19 15:08 |只看该作者
非常感谢timespace,您提供的代码很好用。能得到想要的结果,谢谢!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP