Python学習入門(11)——ソート

8880 ワード

Pythonの内蔵dictionaryデータ型は無秩序であり,keyにより対応するvalueを取得する.しかし、dictionaryのitemをソート出力する必要がある場合があります.keyに基づいてもvalueに基づいても並べ替えられます.
例:
#/usr/bin/python
#
# it-homer in 2013


def test_sort():
  d = {"a":"it", "b":"homer", "c":"sunboy", "d":2050}
  print(d)              # {'a': 'it', 'c': 'sunboy', 'b': 'homer', 'd': 2050}

  d['h'] = "ithomer"
  print(d)              # {'a': 'it', 'h': 'ithomer', 'c': 'sunboy', 'b': 'homer', 'd': 2050}

  del(d['h'])
  print(d)              # {'a': 'it', 'c': 'sunboy', 'b': 'homer', 'd': 2050}


  #      
  for k in d:
    print "dict[%s] = " % k, d[k]

  #
  for k in d:
    print("dict[%s] = %s" % (k, d[k]))

  # items()   
  for k,v in d.items():
    print("dict[%s] = %s" % (k, v))

  # iteritems()   
  for k,v in d.iteritems():
    print("dict[%s] = %s" % (k, v))

  # zip()   
  for k,v in zip(d.iterkeys(), d.itervalues()):
    print("dict[%s] = %s" % (k, v))

  # d.keys()   
  for k in d.keys():
    print("dict[%s] = %s" % (k, d[k]))

  '''
  dict[a] = it
  dict[c] = sunboy
  dict[b] = homer
  dict[d] = 2050
  '''


def test_sort2():
  d = {"a":("it","homer"), "b":{"e":"blog", "f":"forum"}, "c":["sun", "boy", 2050]}
  print(d)              # {'a': ('it', 'homer'), 'c': ['sun', 'boy', 2050], 'b': {'e': 'blog', 'f': 'forum'}}

  print(d['a'])         # ('it', 'homer')
  print(d['a'][0])      # it

  print(d['b'])         # {'e': 'blog', 'f': 'forum'}
  print(d['b']['e'])    # blog

  print(d['c'])         # ['sun', 'boy', 2050]
  print(d['c'][1])      # boy

  d2 = d['b']
  for k in d2:
    print("%s : %s" % (k, d2[k]))       # e : blog  "
" f : forum # d = {"a":"it", "b":"homer"} f = {"a":"blog", "c":"forum"} d.update(f) print d # {'a': 'blog', 'c': 'forum', 'b': 'homer'} d = {} d.setdefault("a") print d # {'a': None} d.setdefault("b", 0) print d # {'a': None, 'b': 0} import copy def test_sort3(): d = {"a":"it", "b":"homer", "c":"blog", "d":"forum"} # f = d.copy() print f # {'a': 'it', 'c': 'blog', 'b': 'homer', 'd': 'forum'} # d = {"a":"it", "b":"homer", "x":{"c":"blog", "d":"forum"}} print d # {'a': 'it', 'x': {'c': 'blog', 'd': 'forum'}, 'b': 'homer'} f = d.copy() print f # {'a': 'it', 'x': {'c': 'blog', 'd': 'forum'}, 'b': 'homer'} d['x']['c'] = 'change' print d # {'a': 'it', 'x': {'c': 'change', 'd': 'forum'}, 'b': 'homer'} print f # {'a': 'it', 'x': {'c': 'change', 'd': 'forum'}, 'b': 'homer'} # d = {"a":"it", "b":"homer", "x":{"c":"blog", "d":"forum"}} print d # {'a': 'it', 'x': {'c': 'blog', 'd': 'forum'}, 'b': 'homer'} f = copy.deepcopy(d) print f # {'a': 'it', 'x': {'c': 'blog', 'd': 'forum'}, 'b': 'homer'} d['x']['c'] = 'change' print d # {'a': 'it', 'x': {'c': 'change', 'd': 'forum'}, 'b': 'homer'} print f # {'a': 'it', 'x': {'c': 'blog', 'd': 'forum'}, 'b': 'homer'} def test_sort4(): d = {"a":1, "c":7, "e":5, "d":9, "b":3} print d # {'a': 1, 'c': 7, 'b': 3, 'e': 5, 'd': 9} # key for k, v in sorted(d.items(), key=lambda x:x[0]): print(k,v) # ('a', 1) ('b', 3) ('c', 7) ('d', 9) ('e', 5) # key for k in sorted(d.keys()): print(k,d[k]) # ('a', 1) ('b', 3) ('c', 7) ('d', 9) ('e', 5) # key l = list(d.keys()) l.sort() for k in l: print(k,d[k]) # ('a', 1) ('b', 3) ('c', 7) ('d', 9) ('e', 5) # value for k, v in sorted(d.items(), key=lambda x:x[1]): print(k,v) # ('a', 1) ('b', 3) ('e', 5) ('c', 7) ('d', 9) # value for k, v in sorted(d.items(), key=lambda x:x[1], reverse = True): print(k,v) # ('d', 9) ('c', 7) ('e', 5) ('b', 3) ('a', 1) # value for k, v in sorted(d.items(), lambda x, y: cmp(x[1], y[1]), reverse = True): print(k,v) # ('d', 9) ('c', 7) ('e', 5) ('b', 3) ('a', 1) if __name__ == "__main__": test_sort() test_sort2() test_sort3() test_sort4()

pythonにsorted関数を内蔵するヘルプドキュメント:sorted(...)sorted(iterable,cmp=None,key=None,reverse=False)-->new sorted listは、dictionaryをソートする方法をいくつか見ていますが、実際には、dictionaryの要素を分離してリストに入れ、listをソートし、dictionaryのソートを間接的に実現するという核心思想があります.この「要素」はkey,valueまたはitemであってもよい.
Listフィールドソート
pythonのソート関数sort,sortedのリストソートと辞書ソートにおける応用詳細と例
pythonリストリストには、リストのソートに使用できる便利なソート関数sort,sortedが内蔵されています.以下は例です.
a = [5,2,1,9,6]        
 
>>> sorted(a)                  # a      ,   a     
[1, 2, 5, 6, 9] 
 
>>> sorted(a,reverse = True)   # a      ,   a     
[9, 6, 5, 2, 1] 
 
>>> a.sort()                   # a      ,  a     
>>> a 
[1, 2, 5, 6, 9] 
 
>>> a.sort(reverse = True)     # a      ,  a     
>>> a 
[9, 6, 5, 2, 1] 
 
  ,a.sort()       ,b = a.sort()       ! 

>>> b = ['aa','BB','bb','zz','CC'] 
>>> sorted(b) 
['BB', 'CC', 'aa', 'bb', 'zz']    #           ascii       ,       ,  sorted(b,reverse=True)   
 
>>> c =['CCC', 'bb', 'ffff', 'z']  
>>> sorted(c,key=len)             #            
['z', 'bb', 'CCC', 'ffff'] 
 
>>> d =['CCC', 'bb', 'ffff', 'z'] 
>>> sorted(d,key = str.lower )    #             ,             ascii        
['bb', 'CCC', 'ffff', 'z'] 
 
>>> 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        
 
>>> f = [{'name':'abc','age':20},{'name':'def','age':30},{'name':'ghi','age':25}]     #          
>>> def age(s): 
       return s['age'] 
>>> ff = sorted(f,key = age)      #        f    age        
 
[{'age': 20, 'name': 'abc'}, {'age': 25, 'name': 'ghi'}, {'age': 30, 'name': 'def'}] 
 
>>> f2 = sorted(f,key = lambda x:x['age'])    #                 ,   lambda        ,     

最後の行、配列のフィールドのソート
参考推奨事項:
python dict sortedソート
Pythonでdictの詳細