学习资料来自于ring翻译的python cook book.源贴于linuxforum ,此处只是记录我自己的一点理解

用二分法在list中搜索

二分法是bisect 提供的基本算法

thislist.sort()
#
必须先排序,否则无法进行二分法搜索

item_insert_point
= bisect.bisect (thislist, theitem )

is_present =
thislist[item_insert_point-1:item_insert_point]==[theitem]

#通过使用slice可以保证在即使没有搜索结果的情况下仍能返回[],这样就不用try

二分法搜索在数据集巨大的情况下效果非常明显,不过最初的sort会有一定的消耗,如果不是频繁查找,个人感觉index就够用了。

 

通过对象属性来排序对象列表

通常的做法:

classlist.sort(lambda
x,y : (cmp(getattr(x,attr),getattr(y,attr))))

快一点的方法:

建立辅助索引

import
operator

tempclasslist
= map ( None , map(getattr,classlist,attr),xrange(len(classlist)),classlist)

tempclasslist.sort()

classlist =
map (operator.getitem,tempclasslist,[-1]*len(classlist))

 

通过元素或者属性来排序

 #coding=cp936
 class Sorter(object):
     def _helper(self,data,aux,inplace):
         aux.sort()
         result=[data[i] for junk, i in aux]
         if inplace:
             data[:]=result
         return result
 
     def byItem(self, data, itemindex=None, inplace=1): 
         if itemindex is None:
             if inplace:
                 data.sort()
                 result = data #直接对源数据sort
             else:
                 result = data[:]
                 result.sort()
                 return result #inplace!=1 赋值
         else:
             aux=[(data[i][itemindex],i) for i in range(len(data))] #[属性,索引]
             return self._helper(data,aux,inplace)
 
     sort=byItem
     __call__=byItem  # sort(data)
 
     def byAttribute(self, data, attributename, inplace=1):
         aux=[(getattr(d[i],attributename),i) for i in 
range(len(data))]
         return self._helper(data,aux,inplace)
 
 
 
 sort = Sorter()
 
 list=[(1,2),(4,8),(0,3)]
 dict=[{'a':3,'b':4},{'a': 5, 'b': 2}, {'a': 0, 'b': 0},{'a': 9, 'b': 9}]
 dumb = [1, 4, 6, 7, 2, 5, 9, 2, 4, 6]

 

通过inplace来确定是否返回值还是在源值修改

__call__ 可实现如下功能:

sort = Sorter()

sort(list)

 

def byAttribute 在本例中没有使用。。疑惑中

 

不用循环从list中随机取值

直接使用random中提供的方法

Import random

random.shuffle(list)   #life is random  J  ipod shuffle ?

for item in
list:

    process (item)

 

random.shuffle的实现十分高效基本原理是

随机进行 x[i], x[j] = x[j], x[i] 数据位置调换,如此不用建立任何新的数据集开销小,速度快

 



评论

该日志第一篇评论

发表评论

评论也有版权!