Chinaunix首页 | 论坛 | 博客
  • 博客访问: 371011
  • 博文数量: 73
  • 博客积分: 3574
  • 博客等级: 中校
  • 技术积分: 1503
  • 用 户 组: 普通用户
  • 注册时间: 2010-03-26 11:17
文章分类

全部博文(73)

文章存档

2012年(14)

2011年(15)

2010年(44)

分类: Python/Ruby

2012-07-19 23:28:58

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

点击(此处)折叠或打开

  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...
阅读(3217) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~