python 处理文本-处理连续数

在oschina里看到一个处理连续数的代码,觉得很赞,这种编码风格是我需要学习的,充分体现了py的精髓,呵呵

果断拉过来。

线上有个需求,格式化,从一堆s1,s100-s199中找出连续的服并且格式化显示出来,

如:

神魔:S106-109,s123,s125

御剑: s106-109,s123,s125


源文件:

神魔 S125

神魔 S123

神魔 S109

神魔 S108

神魔 S10

神魔 S12

神魔 S13

神魔 S14

神魔 S107

神魔 S106

御剑 S125

御剑 S123

御剑 S109

御剑 S108

御剑 S107

御剑 S106


得出结果:

神魔 S10,S12-14,S106-109,S123,S125,

御剑 S106-109,S123,S125,


实现过程如下:

import operator
import itertools
import sys
d={}
for line in open('/usr/local/src/2/file','r'):
  _line=line.split()
  #setdefault(k[,d])  如果K在字典中,返回对应的值,不在的话添加k键及对应的值
  d.setdefault(_line[0], []).append(_line[1])

for key in d.keys():
  #map 对list的每一个元素进行迭代操作
  data=sorted(map(lambda x: int(x[1:]),d[key]))
  sys.stdout.write(key + " ")
  #for j,k in itertools.groupby(enumerate(data), lambda (i,x): i-x):
  for j,k in itertools.groupby(enumerate(data), lambda (i,x): i-x):
    #print j
    #for subitems in k:
      #print subitems
    ret=map(operator.itemgetter(1),k)
    if len(ret) > 1:
      sys.stdout.write("S%d-%d," % (ret[0],ret[-1]))
      #pass
    elif len(ret) == 1:
      sys.stdout.write(str("S%s") % ret[0]+ ",")
      #pass
  sys.stdout.write('\n')
  

#for j,k in d.items():
#  print j,k


你可能感兴趣的:(python 处理文本-处理连续数)