[关闭]
@Frankchen 2016-03-27T03:39:15.000000Z 字数 1755 阅读 1212

Python Sorting

python


最简易的sort方式即是使用sorted(list)函数,注意此函数返回一个排序好的新列表,原列表并未更改。

  1. strs = ['aa', 'BB', 'zz', 'CC']
  2. print sorted(strs) ## ['BB', 'CC', 'aa', 'zz'] (case sensitive)
  3. print sorted(strs, reverse=True) ## ['zz', 'aa', 'CC', 'BB']

Custom Sorting With key=

sorted函数可以使用key函数来排序,如:

  1. strs = ['ccc', 'aaaa', 'd', 'bb']
  2. print sorted(strs, key=len) ## ['d', 'bb', 'ccc', 'aaaa']

key函数的机制是引用一个值并且返回一个代理值,这个代理值用来在排序过程中对各元素进行比较。

另一种场景如,强制排序大小写等同:

  1. ## "key" argument specifying str.lower function to use for sorting
  2. print sorted(strs, key=str.lower) ## ['aa', 'BB', 'CC', 'zz']

你也可以自定义函数,进行任意的排序规则制定:

  1. strs = ['xc', 'zb', 'yd' ,'wa']
  2. ## Write a little function that takes a string, and returns its last letter.
  3. ## This will be the key function (takes in 1 value, returns 1 value).
  4. def MyFn(s):
  5. return s[-1]
  6. ## Now pass key=MyFn to sorted() to sort by the last letter:
  7. print sorted(strs, key=MyFn) ## ['wa', 'zb', 'xc', 'yd']

sort() method

sort()sorted()不同,它直接改变原列表没有返回值,并且它只作用于list,而后者可以在任意场景上使用。

  1. alist.sort() ## correct
  2. alist = blist.sort() ## NO incorrect, sort() returns None

Tuples

Tuples和list相似,但是不能改变大小(其中元素可能改变值)。因此常用来作为返回多个值的函数的返回值的表现方式。例如,如果我需要一组三维坐标,自然的Python表现方式就是每个tuples是三维的装载一个(x,y,z)坐标。
tuple用括号封闭,各自方法和list相似:

  1. tuple = (1, 2, 'hi')
  2. print len(tuple) ## 3
  3. print tuple[2] ## hi
  4. tuple[2] = 'bye' ## NO, tuples cannot be changed
  5. tuple = (1, 2, 'bye') ## this works

创建一维tuple必须使用逗号:

  1. tuple = ('hi',) ## size-1 tuple

这是为了和tuple形式相区分。

  1. (x, y, z) = (42, 13, "hike")
  2. print z ## hike
  3. (err_string, err_code) = Foo() ## Foo() returns a length-2 tuple

List 包含

list内可以包含for-in,如:

  1. nums = [1, 2, 3, 4]
  2. squares = [ n * n for n in nums ] ## [1, 4, 9, 16]

注意这里的for不需要冒号。
另一个例子:

  1. strs = ['hello', 'and', 'goodbye']
  2. shouting = [ s.upper() + '!!!' for s in strs ]
  3. ## ['HELLO!!!', 'AND!!!', 'GOODBYE!!!']

甚至可以使用if:

  1. ## Select values <= 2
  2. nums = [2, 8, 1, 6]
  3. small = [ n for n in nums if n <= 2 ] ## [2, 1]
  4. ## Select fruits containing 'a', change to upper case
  5. fruits = ['apple', 'cherry', 'bannana', 'lemon']
  6. afruits = [ s.upper() for s in fruits if 'a' in s ]
  7. ## ['APPLE', 'BANNANA']
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注