免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123
最近访问板块 发新帖
楼主: hothat007
打印 上一主题 下一主题

查找txt文件中第二列最大值 [复制链接]

论坛徽章:
11
技术图书徽章
日期:2014-03-01 14:44:34天蝎座
日期:2014-05-21 22:11:59金牛座
日期:2014-05-30 17:06:14
21 [报告]
发表于 2014-01-23 20:28 |只看该作者
本帖最后由 timespace 于 2014-01-23 20:30 编辑

回复 20# hothat007
看你需要什么,只要简单变通下前面的例子就可以了吧,当然前提是看懂前面那个例子。

1. 取最早出现的那个最大数。利用已有的行序号,修改max的key参数
  1. key=lambda e: (e[2], -e[0])
复制代码
2. 取最晚出现的那个最大数。开始的例子已经实现了。

3. 取所有的最大数。没有系统函数,那么自定义一个函数取代max,然后就会取出一个list,包含所有最大数
  1. def my_max(iterable, key):
  2.     maxs = [next(iterable)]
  3.     for e in iterable:
  4.         key_e, key_max = key(e), key(maxs[0])
  5.         if key_e > key_max:
  6.             maxs = [e]
  7.         elif key_e == key_max:
  8.             maxs.append(e)
  9.     return maxs
复制代码
建议还是多看看标准库的前几章,包含很多基本的迭代排序和数据结构,足以应付很多问题了。



   

论坛徽章:
11
技术图书徽章
日期:2014-03-01 14:44:34天蝎座
日期:2014-05-21 22:11:59金牛座
日期:2014-05-30 17:06:14
22 [报告]
发表于 2014-01-23 21:50 |只看该作者
本帖最后由 timespace 于 2014-01-23 21:51 编辑

其实当查询条件越来越复杂时,直接编码就很麻烦,不如用DB处理这种关系型数据。
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-

  3. import itertools
  4. import sqlite3

  5. def getitems(fobj):
  6.     for idx, line in enumerate(fobj):
  7.         items = line.split()
  8.         if len(items) != 2:
  9.             continue
  10.         # (行索引,一列浮点数,二列整数)
  11.         yield idx, float(items[0]), int(items[1])

  12. def main():
  13.     # 内存数据库统计
  14.     with open('tmp.txt') as fp, sqlite3.connect(':memory:') as con:
  15.         con.executescript('''
  16.             CREATE TABLE foo ( no, float, int );
  17.             CREATE INDEX bar ON foo ( float, int );
  18.         ''')
  19.         con.executemany('INSERT INTO foo VALUES(?,?,?)', getitems(fp))
  20.         for row in con.execute('SELECT no,float,int  FROM foo \
  21.                 WHERE float >= 28.0 and float <= 29.0 \
  22.                 ORDER BY int DESC LIMIT 10'):
  23.             print row

  24. if __name__ == '__main__':
  25.     main()
复制代码

论坛徽章:
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
23 [报告]
发表于 2014-01-24 11:11 |只看该作者
回复 1# hothat007

  1. def compareItem(item1, item2):
  2.     ''' Function provide 2nd column comparing method for reduce to use.'''
  3.     if int(item1.split()[1]) > int(item2.split()[1]):
  4.         return item1
  5.     else:
  6.         return item2

  7. def readRecords(filename):
  8.     ''' read all data from file for coming reduce to filter.'''
  9.     result = []
  10.     file_handle = open(filename)
  11.     for item in file_handle.readlines():
  12.         result.append(item)
  13.     return result

  14. def main():
  15.     data = readRecords('DYC-P072-2 2014-01-21 12.txt')
  16.     print(reduce(compareItem, data))

  17. if __name__ == '__main__':
  18.     main()
复制代码

论坛徽章:
0
24 [报告]
发表于 2014-01-24 20:01 |只看该作者
本帖最后由 hothat007 于 2014-01-24 20:02 编辑

回复 21# timespace


   

好像不太对呀,原来的那个代码是提取的第一个最大值呀

论坛徽章:
0
25 [报告]
发表于 2014-01-24 20:19 |只看该作者
回复 21# timespace


    key=lambda e: (e[2], -e[0])这句怎么理解呀,理解不了了T_T

论坛徽章:
11
技术图书徽章
日期:2014-03-01 14:44:34天蝎座
日期:2014-05-21 22:11:59金牛座
日期:2014-05-30 17:06:14
26 [报告]
发表于 2014-01-24 20:45 |只看该作者
回复 24# hothat007
嗯,你说对了。更正下:
1.取最早的最大数,开始已实现。

2.取最晚的最大数,修改max的key参数为
  1. key=lambda e: (e[2], e[0])
复制代码

论坛徽章:
11
技术图书徽章
日期:2014-03-01 14:44:34天蝎座
日期:2014-05-21 22:11:59金牛座
日期:2014-05-30 17:06:14
27 [报告]
发表于 2014-01-24 21:06 |只看该作者
本帖最后由 timespace 于 2014-01-24 21:11 编辑

回复 25# hothat007
1. 理解max(..., key)执行的逻辑。顺序迭代,元素a和b比较等价于key(a)和key(b)比较,最终迭代完成时返回一个最大值。
  1. lambda e: (e[2], e[0])
复制代码
等价于
  1. def key(e):
  2.     return e[2], e[0] # 返回的是一个tuple
复制代码
2. 理解tuple比较的逻辑。简单说就是当tuple第i个元素已经可以比较出大小时,就不会再去比较第i+1个元素。下面的例子就可以看出这个特性:
  1. >>> max([(1, 1), (2, 2), (3, 2)], key=lambda e: e[1])
  2. (2, 2)
  3. >>> max([(1, 1), (2, 2), (3, 2)], key=lambda e: (e[1],e[0]))
  4. (3, 2)
  5. >>> max([(1, 1), (2, 2), (3, 2)], key=lambda e: (e[1],-e[0]))
  6. (2, 2)
  7. >>> max([(1, 1), (2, 2), (3, 2), (4, 0)], key=lambda e: (e[1],e[0]))
  8. (3, 2)
复制代码
3. 你的需求中,元素出现早晚可以用行序号表示,所以将e[0]作为比较参数,但它是次要关系。

论坛徽章:
0
28 [报告]
发表于 2014-01-24 21:20 |只看该作者
回复 27# timespace


    感动哭了,太给力了!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP