读入后,要进行组内排序,按groupseq字段排序后,然后统计前后两个项的个数,累加到全局。

sorted函数使用如下:

def sortlist(alllist):

    sorted_key1_1=sorted(alllist,key=lambda k:k['groupseq'])

    return sorted_key1_1

keylist = readline()

for key in keylist:

       sortlist=(keylist[key])

全段代码如下

#!/usr/bin/python

# -*- coding: utf-8 -*-

#vim set ts=4 expandtab

import sys

keylist={}

def readline():

    global keylist

    filecontent= open('g:\\test.txt','r')

    for line in filecontent.xreadlines():

    #for line in sys.stdin:

        line.strip()

        items=line.split("\t")

        count=0

        appid = items[count]

        count= count+1

        app_version = items[count]

        count= count+1

        act_name=items[count]

        count=count+1

        groupkey=items[count]

        count=count+1

        ggg=items[count]

        groupseq=int(ggg)

        count=count+1

        act_dur=items[count]

        act_dur.strip()

        count=count+1

        key1 = "\t".join((appid,app_version,groupkey))

        value1={}

        value1['act_name']=act_name

        value1['groupseq']=groupseq

        value1['act_dur']=act_dur

        if not key1 in keylist:

            keylist[key1]=[]

        keylist[key1].append(value1)

        #it="\t".join((appid,app_version,groupkey,act_name,groupseq,act_dur))

        #print it.strip()

    #return keylist

def sortlist(alllist):

    sorted_key=sorted(alllist,key=lambda k:k['groupseq'])

    #print sorted_key

    #print type(sorted_key)

    return sorted_key

if __name__ == '__main__':

     countall={}

     duration={}

     readline()

     for keys in keylist.keys():

         sorted_list=sortlist(keylist[keys])

         #print sorted_list[0]

         length=len(sorted_list)

         #for value in sorted_list:

         prev_page=""

         for i in range(length):

             current_page = sorted_list[i]['act_name']

             if "unknown" == current_page:

                 prev_page = current_page  

                 #continue

             else:

                 num=sorted_list[i]['act_dur']

                 count_duration=float(num.strip())

                 allkeys=keys.split("\t")

                 keycount='\t'.join((allkeys[0],allkeys[1],prev_page,current_page))

                 if not keycount in countall:

                    countall[keycount]=0

                 countall[keycount]+=1

                 if not keycount in duration:

                    duration[keycount]=0

                 duration[keycount] += count_duration                   

                 if current_page == "exit":

                     break

                 prev_page = current_page

           

     for key_cou in countall:

         output="\t".join((key_cou,str(countall[key_cou]),str(duration[key_cou])))

         #output = "\t".join((key_cou,str(countall[key_cou])))    

         print output.strip()

这里的列表中,元素为字典。用key传函数,参数为x["key],这里的x在运行时,会被赋成列表中每个字典对象

f = [{'name':'abc','age':20},{'name':'def','age':30},{'name':'ghi','age':25}]

def age(s):

    return s['age']

print sorted(f,key = age)#列表按f中字典的age从小到大排序。也就是说,传给s的是每个字典对象,s是一个字典形参,调用s["key"],则按key排序每个子元素。

也可以:print sorted(f,key = lambda x:x["name"])。#lambda见下面解释使用时,相当于调用key(x)这个函数,其中x被赋值为传入的对象,在这里是每个子对象字典。返回值为x[0],而正是按这个返回值排序。

结果如下:

[{'age': 20, 'name': 'abc'}, {'age': 25, 'name': 'ghi'}, {'age': 30, 'name': 'def'}]

lambda这个匿名函数,使用如下:

m = lambda x,y,z: (x-y)*z#x是参数,函数名是标示符m

print m(3,1,2)#使用时,标示符m作为参数名,,x,y,z作为参数传入。

结果是4

总结,m为函数名,xyz为形参,表达式为返回值

而字典排序:

sl={'b':2,'a':1,'d':4,'c':3}

print sorted(sl,key=lambda x:x[0])#等同于:print sorted(sl,key=lambda x:x

['a', 'b', 'c', 'd'],注意如果是x[1]就报错了。

python对容器内数据的排序有两种,一种是容器自己的sort函数,一种是内建的sorted函数。

不同在于sort是在原位重新排列列表,而sorted()是产生一个新的列表:

--------------------------------sorted---------------------------------------

>>> help(sorted)

Help on built-in function sorted in module __builtin__:

sorted(...)

sorted(iterable, cmp=None, key=None, reverse=False) --> new sorted list

---------------------------------sort----------------------------------------

>>> help(list.sort)

Help on method_descriptor:

sort(...)

L.sort(cmp=None, key=None, reverse=False) -- stable sort *IN PLACE*;

-----------------------------------------------------------------------------

>>> print sorted([5, 2, 3, 1, 4])
[1, 2, 3, 4, 5]
>>> L = [5, 2, 3, 1, 4]
>>> L.sort()
>>> print L
[1, 2, 3, 4, 5]

def lastchar(s): 

            return s[-1]

e = ['abc','b','AAz','ef']

sorted(e,key = lastchar) #自定义函数排序,lastchar为函数名,这个函数返回列表e中每个元素的最后一个字母

['b', 'abc', 'ef', 'AAz'] #sorted(e,key=lastchar)作用就是 按列表e中每个元素的最后一个字母的ascii码从小到大排序

sorted(...)

sorted(iterable, cmp=None, key=None, reverse=False) --> new sorted list

iterable:是可迭代类型;

cmp:是带两个参数的比较函数,比较内容由另一个参数key决定,返回值: 负数: e1 < e2, 0: e1 == e2, 正数: e1 > e2. 默认为 None, 即内建的比较函数.

key:是带一个参数的函数, 用来为每个元素提取比较值. 默认为 None, 即直接比较每个元素.

reverse:排序规则. reverse = True 或者 reverse = False,有默认值。

返回值:是一个排序的可迭代类型,与iterable一样。

通常, key 和 reverse 比 cmp 快很多, 因为对每个元素它们只处理一次; 而 cmp 会处理多次

对由字典排序

  1. >>> d = {'data1':3,'data2':1,'data3':2,'data4':4}
  2. >>> sorted(d.iteritems(), key=itemgetter(1), reverse=True)
  3. [('data4', 4), ('data1',3), ('data3',2),
    ('data2',1)]

引自:http://www.cnblogs.com/linyawen/archive/2012/03/15/2398292.html

Python的内置dictionary数据类型是无序的,通过key来获取对应的value。可是有时我们需要对dictionary中 的item进行排序输出,可能根据key,也可能根据value来排。

list的排序,使用如下

使用cmp:

>>>L = [('b',2),('a',1),('c',3),('d',4)]

>>>print sorted(L, cmp=lambda x,y:cmp(x[1],y[1]))

[('a', 1), ('b', 2), ('c', 3), ('d', 4)]

使用keys:

>>>L = [('b',2),('a',1),('c',3),('d',4)]

>>>print sorted(L, key=lambda x:x[1]))

[('a', 1), ('b', 2), ('c', 3), ('d', 4)]

reverse是决定正序还是倒序的:

>>> print sorted([5, 2, 3, 1, 4], reverse=True)
[5, 4, 3, 2, 1]
>>> print sorted([5, 2, 3, 1, 4], reverse=False)
[1, 2, 3, 4, 5] 注:效率key>cmp(key比cmp快) 在Sorting Keys中:我们看到,此时排序过的L是仅仅按照第二个关键字来排的,如果我们想用第二个关键字
排过序后再用第一个关键字进行排序呢?
>>> L = [('d',2),('a',4),('b',3),('c',2)]
>>> print sorted(L, key=lambda x:(x[1],x[0]))
>>>[('c', 2), ('d', 2), ('b', 3), ('a', 4)]

用 operator 函数来加快速度, 上面排序等价于:(itemgetter的用法见 注释2)

  1. >>> from operator
    import itemgetter, attrgetter
  2. >>> sorted(students, key=itemgetter(2))
>>> from operator import itemgetter, attrgetter
>>> sorted(students, key=itemgetter(2))

用 operator 函数进行多级排序

  1. >>> sorted(students, key=itemgetter(1,2))# sort by grade then by age
  2. [('john', 'A',15), ('dave','B',10),
    ('jane','B',12)]
>>> sorted(students, key=itemgetter(1,2))  # sort by grade then by age
[('john', 'A', 15), ('dave', 'B', 10), ('jane', 'B', 12)]

python的sorted的更多相关文章

  1. Python: sort,sorted,OrderedDict的用法

    Python: sort,sorted,OrderedDict的用法 from http://stqdd.com/archives/427 by 莫亚菜 python对容器内数据的排序有两种,一种是容 ...

  2. Python中sorted()方法

    Python中sorted()方法的用法 1.先说一下iterable,中文意思是迭代器. Python的帮助文档中对iterable的解释是:iteralbe指的是能够一次返回它的一个成员的对象.i ...

  3. python基础——sorted()函数

    python基础——sorted()函数 排序算法 排序也是在程序中经常用到的算法.无论使用冒泡排序还是快速排序,排序的核心是比较两个元素的大小.如果是数字,我们可以直接比较,但如果是字符串或者两个d ...

  4. 【Python】 sorted函数

    我们需要对List.Dict进行排序,Python提供了两个方法对给定的List L进行排序,方法1.用List的成员函数sort进行排序,在本地进行排序,不返回副本方法2.用built-in函数so ...

  5. python中sorted()和set()去重,排序

    前言 在看一个聊天机器人的神经网络模型训练前准备训练数据,需要对训练材料做处理(转化成张量)需要先提炼词干,然后对词干做去重和排序 words = sorted(list(set(words))) 对 ...

  6. [转].Python中sorted函数的用法

    [Python] sorted函数 我们需要对List.Dict进行排序,Python提供了两个方法对给定的List L进行排序,方法1.用List的成员函数sort进行排序,在本地进行排序,不返回副 ...

  7. Python中sorted()方法的用法

    Python中sorted()方法的用法 2012-12-24 22:01:14|  分类: Python |字号 订阅 1.先说一下iterable,中文意思是迭代器. Python的帮助文档中对i ...

  8. Python中sorted函数的用法(转)

    [Python] sorted函数 我们需要对List.Dict进行排序,Python提供了两个方法 对给定的List L进行排序, 方法1.用List的成员函数sort进行排序,在本地进行排序,不返 ...

  9. Python中sorted(iterable, /, *, key=None, reverse=False)的参数中的斜杆是什么意思?

    通过help(sorted)查看sorted的帮助文档,显示如下: Help on built-in function sorted in module builtins: sorted(iterab ...

  10. python 中 sorted() 和 list.sort() 的用法

    今天用python自带的sorted对一个列表进行排序, 在这里总结一下 只要是可迭代对象都可以用sorted . sorted(itrearble, cmp=None, key=None, reve ...

随机推荐

  1. C++笔记010:C++对C的扩展——register关键字增强

    register关键字:请求编译器让变量直接放到CPU内部寄存器里面,而不是通过内存寻址访问,速度快. 在C语言中,register修饰的变量不能取地址,去寄存器变量的地址在C语言里面是会出错的. i ...

  2. Mac下配置远程Linux 服务器SSH密钥认证自动登录

    1. 在本地机器创建公钥 打开万能的终端,执行如下命令,无视一切输出,一路欢快地回车即可. ssh-keygen -t rsa -C 'your email@domain.com' -t 指定密钥类型 ...

  3. 学习在.NET Core中使用RabbitMQ进行消息传递之持久化(二)

    前言 上一节我们简单介绍了RabbitMQ和在安装后启动所出现的问题,本节我们开始正式进入RabbitMQ的学习,对于基本概念请从官网或者其他前辈博客上查阅,我这里不介绍基础性东西,只会简单提一下,请 ...

  4. JavaScript 错误处理 Throw、Try 和 Catch

    try 语句测试代码块的错误. catch 语句处理错误. throw 语句创建自定义错误. JavaScript 错误 当 JavaScript 引擎执行 JavaScript 代码时,会发生各种错 ...

  5. linux系统性能监控--内存利用率

    Linux提供了对物理内存进行合理.高效的访问并可以访问潜在的海量虚存的技术.虚存通常稍多于操作系统实际拥有的内存容量,以便将较少使用的数据卸载到磁盘存储器上,同时又呈现出系统拥有大量物理内存的假象. ...

  6. Java经典设计模式之十一种行为型模式(附实例和详解)

    Java经典设计模式共有21中,分为三大类:创建型模式(5种).结构型模式(7种)和行为型模式(11种). 本文主要讲行为型模式,创建型模式和结构型模式可以看博主的另外两篇文章:Java经典设计模式之 ...

  7. mybatis insert 返回主键

    分享牛,分享牛原创.ssm整合的时候,我们操作mybatis insert 的时候,需要返回插入的主键,因为主键是自增的,这个时候怎么办呢?很简单看一下下面的代码示例: 1.1.1. 代码定义 pub ...

  8. React Native之ListView实现九宫格效果

    概述 在安卓原生开发中,ListView是很常用的一个列表控件,那么React Native(RN)如何实现该功能呢?我们来看一下ListView的源码 ListView是基于ScrollView扩展 ...

  9. Struts 2 之校验器

    对于输入校验,Struts2提供了两种方式,1.使用validate方法:2.基于XML配置实现 . validate()方法 支持校验的Action必须实现Validateable接口,一般直接继承 ...

  10. Ubuntu和Windows设备共享

    http://blog.csdn.net/pipisorry/article/details/51725942 蓝牙设备如键盘.鼠标都可以. 装的双系统win7和Ubuntu,如果只使用一个系统,蓝牙 ...