雨久 发表于 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

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

icymirror 发表于 2014-03-18 17:30

可以考虑使用字典中的值是列表的方式来组织数据。

timespace 发表于 2014-03-19 10:26

回复 1# 雨久
印象中很久以前你也问过类似的问题,Python入门应该很快啊:em17:import io

infile1 = io.StringIO(
'''Sam
Tom
Billy
Fang
Yong
Bill
''')

infile2 = io.StringIO(
'''Sam,25
Sam,teacher
Sam,America
Tom,student
Tom,ITer
Billy,38
Billy,professor
Fang,famer
Yong,Phd
''')


def main():
    name_db = {}
    for line in infile2:
      fields = line.rstrip().split(',')
      if len(fields) == 2:
            name_db.setdefault(fields, []).append(fields)
    for line in infile1:
      name = line.rstrip()
      value = ';'.join(name_db) if name in name_db else 'no hit'
      print(name, value, sep=',')

if __name__ == '__main__':
    main()保存为test.py,执行:bash-3.2 $python --version
Python 3.3.4
bash-3.2 $python test.py
Sam,25;teacher;America
Tom,student;ITer
Billy,38;professor
Fang,famer
Yong,Phd
Bill,no hit

雨久 发表于 2014-03-19 12:17

感谢timespace大神:wink::wink::wink:
平时没有努力学习啊,大神见笑了。
把代码改写如下,没有运行出来:dizzy:

import sys

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

if __name__ == '__main__':
    main()

timespace 发表于 2014-03-19 13:11

回复 4# 雨久
报什么错?贴出内容


   

雨久 发表于 2014-03-19 13:18

没有报错,只是除了no hit,其它的值都没有写进去,结果如下:

Sam
Tom
Billy
Fang
Yong
Bill, no hit

timespace 发表于 2014-03-19 14:05

回复 6# 雨久
很容易就改为2.7版本的:from cStringIO import StringIO

infile1 = StringIO(
'''Sam
Tom
Billy
Fang
Yong
Bill
''')

infile2 = StringIO(
'''Sam,25
Sam,teacher
Sam,America
Tom,student
Tom,ITer
Billy,38
Billy,professor
Fang,famer
Yong,Phd
''')

def main():
    name_db = {}
    for line in infile2:
      fields = line.rstrip().split(',')
      if len(fields) == 2:
            name_db.setdefault(fields, []).append(fields)
    for line in infile1:
      name = line.rstrip()
      value = ';'.join(name_db) if name in name_db else 'no hit'
      print '{},{}'.format(name, value)   

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

   

雨久 发表于 2014-03-19 15:08

非常感谢timespace,您提供的代码很好用。能得到想要的结果,谢谢!
页: [1]
查看完整版本: 请教一个在列表或者字典中取值相加的问题