免费注册 查看新帖 |

Chinaunix

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

请教个思路问题 [复制链接]

论坛徽章:
1
IT运维版块每日发帖之星
日期:2016-02-27 06:20:00
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-06-23 23:29 |只看该作者 |倒序浏览
有以下一些数据
$  cat data
D071 BIH-S-9933 10.163.81.109 13
D071 BIH-S-231  10.163.81.109 14
B128 BIH-S-239  10.163.81.19 15
A82   BIH-S-9013 10.163.81.10 17

希望根据第三列数据的不同分添加空行,使显示效果好一些,使结果如下:
D071 BIH-S-9933 10.163.81.109 13
D071 BIH-S-231  10.163.81.109 14

B128 BIH-S-239  10.163.81.19 15

A82   BIH-S-9013 10.163.81.10 17

这是个人想到的方法
  1. #!/usr/bin/env python

  2. f = open('data','r')

  3. wordlist = []
  4. for lined in f.readlines():
  5.         line = lined[:-1]
  6.         words = line.split()
  7.         if words[2] not in wordlist:
  8.                 wordlist.append(words[2])
  9.                 print "\n"+line
  10.         else:
  11.                 print line

  12. print ""
  13. f.close()
复制代码
个人感觉还可以更简单,哪位高人指点一下解决的思路,or 贴一下代码看看有何更好的方法,以供学习,谢谢!

论坛徽章:
0
2 [报告]
发表于 2010-06-24 09:49 |只看该作者
  1. #coding=utf-8

  2. lines = []
  3. for line in open('b.txt', 'r'):
  4.     line = line.strip()
  5.     fields = line.split()
  6.     fields = [f.strip() for f in fields]
  7.     lines.append(fields)

  8. #lines = sorted(lines, key=lambda x:x[2], reverse=True)

  9. i = 0
  10. frontLine = ''
  11. result = []
  12. for line in lines:
  13.     linestr = ' '.join(line)

  14.     if i > 0 and not line[2] == frontLine:
  15.         result.append('\n')

  16.     result.append(linestr)
  17.    
  18.     frontLine = line[2]
  19.     i += 1

  20. print '\n'.join(result)
复制代码
我试了下。不过处理的文件太大的话就不能用我这个了

论坛徽章:
0
3 [报告]
发表于 2010-06-24 14:52 |只看该作者
wordlist = []会很大的话 可以考虑定义成字典。

论坛徽章:
0
4 [报告]
发表于 2010-06-24 16:08 |只看该作者
wordlist = []会很大的话 可以考虑定义成字典。
luffy.deng 发表于 2010-06-24 14:52



    字典是很快,不过数据量太大的时候你也载入不到内存中啊。还是就是字典在一定数量级比如千万的时候也快不到什么地方去。哈

论坛徽章:
0
5 [报告]
发表于 2010-06-24 18:44 |只看该作者
回复 4# t6760915
我只是觉得wordlist比较大的时候,  if words[2] not in wordlist 操作会比  wordlist.has_key(words[2])慢,具体还得测试了才知道。

论坛徽章:
0
6 [报告]
发表于 2010-06-24 18:55 |只看该作者
回复  t6760915
我只是觉得wordlist比较大的时候,  if words[2] not in wordlist 操作会比  wordlist.ha ...
luffy.deng 发表于 2010-06-24 18:44



    这确实是比list快多了,可以采用存储md5的方法避免数据量比较大的情况。不过这个问题也不涉及到数据大小的问题,别一次全部载入就可以了,处理完就从内存里删应该不会出什么问题

论坛徽章:
0
7 [报告]
发表于 2010-06-24 22:15 |只看该作者
数据是有序的吗?

会出现这样的数据么

  1. D071 BIH-S-231  10.163.81.109 14
  2. B128 BIH-S-239  10.163.81.19 15
  3. A82   BIH-S-9013 10.163.81.10 17
  4. D071 BIH-S-9933 10.163.81.109 19
复制代码

论坛徽章:
1
IT运维版块每日发帖之星
日期:2016-02-27 06:20:00
8 [报告]
发表于 2010-06-24 22:59 |只看该作者
回复 7# Kabie


    数据是有序的,即第三列相同的数据是连在一起的,只是数量不指定,有可能一个ip只有1行数据,又或者有上百行这样。整个data文件行数会变化,最多会有3k~4k行的样子。

D071 BIH-S-9933 10.163.81.109 13
D071 BIH-S-231  10.163.81.109 14
B128 BIH-S-239  10.163.81.19 15
A82   BIH-S-9013 10.163.81.10 17
A82   BIH-S-433 10.163.81.10 17
B34   BIH-S-0933 10.163.81.10 17

论坛徽章:
1
IT运维版块每日发帖之星
日期:2016-02-27 06:20:00
9 [报告]
发表于 2010-06-24 23:01 |只看该作者
回复 3# luffy.deng


    请教下,在这里怎么引用字典来做呢?能结合代码说说吗?谢谢!

论坛徽章:
0
10 [报告]
发表于 2010-06-25 09:17 |只看该作者
  1. #coding=utf-8

  2. f = open('data','r')

  3. wordDict = {}

  4. for lined in f:
  5.         line = lined[:-1]
  6.         words = line.split()
  7.         
  8.         ip = words[2]
  9.         if wordDict.has_key(ip):
  10.             print line
  11.         else:
  12.             wordDict[ip] = 1
  13.             print "\n"+line

  14. print ""

  15. f.close()
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP