Chinaunix首页 | 论坛 | 博客
  • 博客访问: 12934
  • 博文数量: 6
  • 博客积分: 60
  • 博客等级: 民兵
  • 技术积分: 45
  • 用 户 组: 普通用户
  • 注册时间: 2010-10-24 00:19
文章分类
文章存档

2012年(6)

我的朋友
最近访客

分类:

2012-07-22 22:20:19

原文地址:一个python小功能 作者:luoyan_xy

    要求,实现以下功能的函数:

点击(此处)折叠或打开

  1. myfunc([2,3,4,5,12,13,14,15,16,20])

  2. returns:
  3. [(2,5),(12,16),20]
  
    如果让我来实现,实现的方式注定比较笨一些,可能也就类似C语言的遍历判断了,不过在stackoverflow上有人给出了这样的答案:
  

点击(此处)折叠或打开

  1. from operator import itemgetter
  2. from itertools import groupby

  3. data = [2,3,4,5,12,13,14,15,16,20]
  4. for k,g in groupby(enumerate(data),lambda(i,x):i - x):
  5.     print map(itemgetter(1),g)

  6. output:
  7. [2,3,4,5]
  8. [12,13,14,15,16]
  9. [20]

      里面涉及到不少之前没见过的python特性,慢慢分析:
1、enumerate
      用于对一个列表或数组既需要遍历索引又要遍历元素时,会这样写:

点击(此处)折叠或打开

  1. for i in range(0.len(list)):
  2.     print i,list[i]
  3. '''使用enumerate关键字后'''
  4. for index,text in enumerate(list):
  5.     print index,text
     在cookbook里介绍,如果你要计算文件的行数,可以这样写:

点击(此处)折叠或打开

  1. count = len(open(file,'ru').readlines)

  2. '''这种方法在遇到文件比较大时会很慢甚至不能工作,因此'''
  3. count = -1
  4. for count,line in enumerate(open(file,'ru')):
  5.     pass
  6. count += 1

2、groupby
     groupby位于python的itertools内,它的典型调用形式如下

点击(此处)折叠或打开

  1. from itertools import groupby

  2. groupby(iterable[,key])
     它接收一个可迭代的序列,以及一个比较函数key,它返回一个生成二元组的迭代器,每一个二元组包含key(each item)的结果和另一个包含着所有共享这个key结果的元素的迭代器。
     通常情况下,这个可迭代的序列需要保证在相同的key function下已经有序,groupby的这类操作类似于unix系统中的uniq函数调用。
     举一个例子:

点击(此处)折叠或打开

  1. names = ['Alex','Anne','Chris','Ethan','Wesley']
  2. '''通过groupby把names中的元素以len长度进行分组,长度相等的位于一组'''
  3. groups = groupby(names,len)
  4. for name_length,name_iter in groups:
  5.     print 'name with %d letters:' %name_length
  6.     for name in name_iter:
  7.         print name

  8. output:
  9. name with 4 letters:
  10. Alex
  11. Anne
  12. name with 5 letters:
  13. Chris
  14. Ethan
  15. name with 6 letters:
  16. Wesley
   当然了,这个key function可以更加复杂,比如文章开头例子中的key = lambda(i,x): i - x,其利用学历的序号的自增,保证连续的数字拥有相同的(数字、序号)差,从而完成分组的目的
 
3、itemgetter(item[,args])
   对于这个特性,举个例子应该更容易明白:

点击(此处)折叠或打开

  1. from operator import itemgetter

  2. >>>itemgetter(1)('ABCD')
  3. 'B'
  4. >>>itemgetter(1,3,5)('ABCDEFG')
  5. ('B','D','F')

  6. >>>inventory = [('apple',3),('banana',2),('pear',5),('orange',1)]
  7. >>>getcount = itemgetter(1)
  8. >>>map(getcount,inventory)
  9. [3,2,5,1]
  10. >>>sorted(inventory,key = getcount)
  11. [('orange',1),('banana',2),('apple',3),('pear',5)]
  12. '''最后一个sorted类似于平时常用的按指定列排序'''
  13. >>>sorted(inventory,ken = lambda x:x[1])

4、to be continue...
阅读(773) | 评论(0) | 转发(0) |
0

上一篇:python处理二进制数据

下一篇:没有了

给主人留下些什么吧!~~