python 中的dict和list 排序

来源:互联网 发布:广告喊话软件 编辑:程序博客网 时间:2024/05/18 02:47

python下的排序可以很方便的调用各种方法来解决。

另,由于字符串可以简单的转换成list,因此字符串排序也可以解决。


将字符串转换成list (http://piziyin.blog.51cto.com/2391349/568426)

>>> import string
>>> str = 'abcde'
>>> list = list(str)
>>> list
['a', 'b', 'c', 'd', 'e']
>>> str
'abcde'
>>> str_convert = ''.join(list)
>>> str_convert
'abcde'
>>>

但如果是最简单的字符串逆序,那么可以直接通过改变下标来实现。(http://hi.baidu.com/fishhatta/item/0767d518f78c381fe2f98650)

>>>str[::-1] 

'edcba'



  python中dict和list排序

1、list排序
   列表的排序是python内置功能,自身含有sort方法
   如:
   >>> s=[2,1,3,0]
   >>> s.sort()
   [0, 1, 2, 3]
2、dict排序
   对字典的排序,因为每一个项包括一个键值对,所以要选择可比较的键或值进行排序
    sorted(iterable[, cmp[, key[, reverse]]]
    cmp和key一般使用lambda
  如:
  >>> d={"ok":1,"no":2}
  对字典按键排序,用元组列表的形式返回
  >>> sorted(d.items, key=lambda d:d[0])
  [('no', 2), ('ok', 1)]
  对字典按值排序,用元组列表的形式返回
   >>> sorted(d.items, key=lambda d:d[1])
  [('ok', 1), ('no', 2)]
3、元组列表排序
   如
  >>> li=[(2,'a'),(4,'b'),(1,'d')]
  >>> li.sort()
  [(1, 'd'), (2, 'a'), (4, 'b')]
  如果字典按项的第一个元素排序的话,可以转换成元组列表来进行
  >>> d={"ok":1,"no":2}
  >>> tt=[tuple(item) for item in d.items()]
  >>> tt.sort()
  [('no', 2), ('ok', 1)]

4 其他人的实现,留住备忘

  下面是一个结构的例子

>>> class test:
         def __init__(self,a,b):
              self.a = a
              self.b = b

>>> test1 = test(5,25)
>>> test2 = test(10,15)
>>> tests = [test1,test2]
>>> sorted(tests,cmp = lambda x,y: cmp(x.a, y.a)) 

>>> result = sorted(tests,key = lambda d:d.a)


5、
# (IMHO) the simplest approach:
def sortedDictValues1(adict):
    items = adict.items()
    items.sort()
    return [value for key, value in items]
# an alternative implementation, which
# happens to run a bit faster for large
# dictionaries on my machine:
def sortedDictValues2(adict):
    keys = adict.keys()   keys.sort()   return [dict[key] for key in keys]
# a further slight speed-up on my box
# is to map a bound-method:
def sortedDictValues3(adict):
    keys = adict.keys()
    keys.sort()
    return map(adict.get, keys)

                                

各种代码实现:

python 列表(list)和字典(dict)数据排序

2008-06-20 09:38:01


Python: sort,sorted,OrderedDict的用法

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

sort函数和sorted函数唯一的不同是,sort是在容器内排序,sorted生成一个新的排好序的容器。

 

对于一个简单的数组 L=[5,2,3,1,4].

sort: L.sort()

 

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

iterable:待排序的可迭代类型的容器;
cmp:用于比较的函数,比较什么由key决定,有默认值,迭代集合中的一项;
key:用列表元素的某个已命名的属性或函数(只有一个参数并且返回一个用于排序的值)作为关键字,有默认值,迭代集合中的一项;
reverse:排序规则. reverse = True 或者 reverse = False,有默认值。
返回值:是一个经过排序的可迭代类型,与iterable一样。

 

如果是一个多维的列表 L=[(‘b’,2),(‘a’,1),(‘c’,3),(‘d’,4)].

有三种选择对这个多维列表进行排序

  • 利用cmp函数

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

L.sort(cmp=lambda x,y:cmp(x[1],y[1]))

  • 利用key

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

L.sort(key=lambda x:x[1]);

  • 反序

以上几种排序均可加上参数reverse.

例如 sorted(reverse=True), L.sort(reverse=True). 或者改成False

OrderedDict是collections中的一个包,能够记录字典元素插入的顺序,常常和排序函数一起使用来生成一个排序的字典。

比如,比如一个无序的字典

d = {‘banana’:3,’apple’:4,’pear’:1,’orange’:2}

通过排序来生成一个有序的字典,有以下几种方式

collections.OrderedDict(sorted(d.items(),key = lambda t:t[0]))

或者

collections.OrderedDict(sorted(d.items(),key = lambda t:t[1]))

或者

collections.OrderedDict(sorted(d.items(),key = lambda t:len(t[0])))


  1. 附:python内置类型  
  2. 1、list:列表(即动态数组,C++标准库的vector,但可含不同类型的元素于一个list中)  
  3. a = ["I","you","he","she"]      #元素可为任何类型。  
  4.   
  5. 下标:按下标读写,就当作数组处理  
  6. 0开始,有负下标的使用  
  7. 0第一个元素,-1最后一个元素,  
  8. -len第一个元素,len-1最后一个元素  
  9. 取list的元素数量                  
  10. len(list)   #list的长度。实际该方法是调用了此对象的__len__(self)方法。   
  11.   
  12. 创建连续的list  
  13. L = range(1,5)      #即 L=[1,2,3,4],不含最后一个元素  
  14. L = range(1102#即 L=[1, 3, 5, 7, 9]  
  15.   
  16. list的方法  
  17. L.append(var)   #追加元素  
  18. L.insert(index,var)  
  19. L.pop(var)      #返回最后一个元素,并从list中删除之  
  20. L.remove(var)   #删除第一次出现的该元素  
  21. L.count(var)    #该元素在列表中出现的个数  
  22. L.index(var)    #该元素的位置,无则抛异常   
  23. L.extend(list)  #追加list,即合并list到L上  
  24. L.sort()        #排序  
  25. L.reverse()     #倒序  
  26. list 操作符:,+,*,关键字del  
  27. a[1:]       #片段操作符,用于子list的提取  
  28. [1,2]+[3,4#为[1,2,3,4]。同extend()  
  29. [2]*4       #为[2,2,2,2]  
  30. del L[1]    #删除指定下标的元素  
  31. del L[1:3]  #删除指定下标范围的元素  
  32. list的复制  
  33. L1 = L      #L1为L的别名,用C来说就是指针地址相同,对L1操作即对L操作。函数参数就是这样传递的  
  34. L1 = L[:]   #L1为L的克隆,即另一个拷贝。  
  35.           
  36. list comprehension  
  37.    [ <expr1> for k in L if <expr2> ]  
  38.                   
  39. 2、dictionary: 字典(即C++标准库的map)  
  40. dict = {'ob1':'computer''ob2':'mouse''ob3':'printer'}  
  41. 每一个元素是pair,包含key、value两部分。key是Integer或string类型,value 是任意类型。  
  42. 键是唯一的,字典只认最后一个赋的键值。  
  43.   
  44. dictionary的方法  
  45. D.get(key, 0)       #同dict[key],多了个没有则返回缺省值,0。[]没有则抛异常  
  46. D.has_key(key)      #有该键返回TRUE,否则FALSE  
  47. D.keys()            #返回字典键的列表  
  48. D.values()          #以列表的形式返回字典中的值,返回值的列表中可包含重复元素  
  49. D.items()           #将所有的字典项以列表方式返回,这些列表中的每一项都来自于(键,值),但是项在返回时并没有特殊的顺序           
  50.   
  51. D.update(dict2)     #增加合并字典  
  52. D.popitem()         #得到一个pair,并从字典中删除它。已空则抛异常  
  53. D.clear()           #清空字典,同del dict  
  54. D.copy()            #拷贝字典  
  55. D.cmp(dict1,dict2)  #比较字典,(优先级为元素个数、键大小、键值大小)  
  56.                     #第一个大返回1,小返回-1,一样返回0  
  57.               
  58. dictionary的复制  
  59. dict1 = dict        #别名  
  60. dict2=dict.copy()   #克隆,即另一个拷贝。  
  61.   
  62. 3、tuple:元组(即常量数组)  
  63. tuple = ('a''b''c''d''e')  
  64. 可以用list的 [],:操作符提取元素。就是不能直接修改元素。  
  65.   
  66. 4、string:     字符串(即不能修改的字符list)  
  67. str = "Hello My friend"  
  68. 字符串是一个整体。如果你想直接修改字符串的某一部分,是不可能的。但我们能够读出字符串的某一部分。  
  69. 子字符串的提取  
  70. str[:6]  
  71. 字符串包含判断操作符:innot in  
  72. "He" in str  
  73. "she" not in str  
  74.   
  75. string模块,还提供了很多方法,如  
  76. S.find(substring, [start [,end]]) #可指范围查找子串,返回索引值,否则返回-1  
  77. S.rfind(substring,[start [,end]]) #反向查找  
  78. S.index(substring,[start [,end]]) #同find,只是找不到产生ValueError异常  
  79. S.rindex(substring,[start [,end]])#同上反向查找  
  80. S.count(substring,[start [,end]]) #返回找到子串的个数  
  81.   
  82. S.lowercase()  
  83. S.capitalize()      #首字母大写  
  84. S.lower()           #转小写  
  85. S.upper()           #转大写  
  86. S.swapcase()        #大小写互换  
  87.   
  88. S.split(str, ' ')   #将string转list,以空格切分  
  89. S.join(list, ' ')   #将list转string,以空格连接  
  90.   
  91. 处理字符串的内置函数  
  92. len(str)                #串长度  
  93. cmp("my friend", str)   #字符串比较。第一个大,返回1  
  94. max('abcxyz')           #寻找字符串中最大的字符  
  95. min('abcxyz')           #寻找字符串中最小的字符  
  96.   
  97. string的转换  
  98.               
  99. float(str) #变成浮点数,float("1e-1")  结果为0.1  
  100. int(str)        #变成整型,  int("12")  结果为12  
  101. int(str,base)   #变成base进制整型数,int("11",2) 结果为2  
  102. long(str)       #变成长整型,  
  103. long(str,base)  #变成base进制长整型,  
  104.   
  105. 字符串的格式化(注意其转义字符,大多如C语言的,略)  
  106. str_format % (参数列表) #参数列表是以tuple的形式定义的,即不可运行中改变  
  107. >>>print ""%s's height is %dcm" % ("My brother"180)  
  108.           #结果显示为 My brother's height is 180cm  
  109.   
  110. 。。。。。。。。。。。。。。。。。。  
  111.   
  112. list 和 tuple 的相互转化  
  113.   
  114. tuple(ls)   
  115. list(ls) 


参考以下博客:

http://www.douban.com/note/13460891/

http://blog.csdn.net/songchunyi/article/details/6543369

http://blog.csdn.net/songchunyi/article/details/6543369

http://stqdd.com/archives/427 

http://blog.csdn.net/business122/article/details/7536991


0 0
原创粉丝点击