seq = [9, 8, 7, 6, 5, 4, 3] random.shuffle(seq)
# seq:[6, 4, 9, 3, 8, 5, 7] print(quicksort(seq))
# 输出:[3, 4, 5, 6, 7, 8, 9] 3. 冒泡排序
冒泡排序(顺序形式),从左向右,两两比较,如果左边元素大于右边,就交换两个元素的位置。其中,每一轮排序,序列中最大的元素浮动到最右面。也就是说,每一轮排序,至少确保有一个元素在正确的位置。这样接下来的循环,就不需要考虑已经排好序的元素了,每次内层循环次数都会减一。其中,如果有一轮循环之后,次序并没有交换,这时我们就可以停止循环,得到我们想要的有序序列了。
def bouble_sort(sequence): seq = sequence[:] length = len(seq) - 1 i = j = 0 flag = 1
while i < length: j = 0
while j < length - i: if seq[j] > seq[j + 1]:
seq[j], seq[j + 1] = seq[j + 1], seq[j] flag = 0 j += 1 if flag: break
16
i += 1 return seq 4. 选择排序
选择排序,每次选择当前序列的最小值,将其与当前序列的第一个元素交换位置,每迭代一次,当前序列长度减一。迭代结束,即可得到有序序列。 def find_minimal_index(seq): min_elem = seq[0] count = 0
min_elem_index = count for elem in seq[1:]: count += 1
if elem < min_elem:
elem, min_elem = min_elem, elem min_elem_index = count return min_elem_index def select_sort(sequence): # 选择排序
seq = sequence[:] length = len(seq) for i in range(length):
index = find_minimal_index(seq[i:])
seq[index + i], seq[i] = seq[i], seq[index + i] return seq 5. 去重序列重复元素
首先新建一个集合 set,对于序列中的元素,如果已经在集合中了,我们就不返回这个值。如果不在集合中,就向集合添加这个元素,并返回这个值。key
17
是函数名,通过修改 key,我们可以改变重复元素的判断依据。比如对于下面这个序列:a = [{'a': 6, 'b': 4}, {'a': 6, 'b': 3}, {'a': 6, 'b': 4},{'a': 8, 'b': 12}]list(dedupe(a, lambda x: x['a']))这里我们把 dedupe 设置为,基于关键字 ‘a’ 对应值去除重复元素,也就是说集合中添加的元素为关键字 ‘a’ 对应值。输出为:[{'a': 6, 'b': 4}, {'a': 8, 'b': 12}]list(dedupe(a, lambda x: (x['a'],x['b'])))这里,集合添加的是关键字’a’和’b’对应值的元组。 输出为: [{'a': 6, 'b': 4}, {'a': 6, 'b': 3}, {'a': 8, 'b': 12}] # Python高效编程
def dedupe(sequence, key): # 依序去除重复元素 seen = set() items = sequence[:] for item in items: if key:
seq = key(item) if seq not in seen: seen.add(seq) yield item 6. Vector
这一节,我们来实现一个简单的 Vector 类。Vector 类有两个属性,为 x,y 坐标,即对应向量的横纵坐标。首先,实现重载 + 号的方法def __add__,及实现两个向量的加法。具体做法是:将加号两边的 Vector 对象的 x, y值相加,得到新的 x, y值并且返回一个新的向量对象。__sub__方法实现了 Vector 对象的减法,和加法差不多。让向量对象的对应属性相减,并返回新的向量对
18
象。__ads__方法,使得可以对实例进行 ads操作(即取横纵坐标的模)。__mul__方法,使得实例可以通过乘法进行伸缩的操作。__repr__与__str__方法使得打印对象更加美观。 import math # Python高效编程 class Vector(object): def __init__(self, x, y): self.x = x self.y = y
def __add__(self, other): x = self.x + other.x y = self.y + other.y return Vector(x, y) def __sub__(self, other): x = self.x - other.x y = self.y - other.y return Vector(x, y) def __abs__(self):
return math.sqrt(self.x ** 2 + self.y ** 2) def __bool__(self):
return bool(self.x or self.y) def __mul__(self, times):
return Vector(self.x * times, self.y * times) def __repr__(self):
return 'Vector({}, {})'.format(self.x, self.y) __str__ = __repr__ def main(): v1 = Vector(3, 5) v2 = Vector(4, 5) v3 = v1 + v2 v4 = v3 * 2
19
v5 = v2 - v1 print(v3) print(v4) print(abs(v3)) print(v5)
if __name__ == '__main__': main() # 输出:
# Vector(7, 10) # Vector(14, 20) # 12.206555615733702 # Vector(1, 0) 7. 具名元组
具名元组(namedtuple) 是 python 标准库 collections 中的工厂函数。它接受两个参数,第一个参数表示类的名称,第二个参数是类的字段名。后者可以是可迭代对象,也可以是空格隔开的字符串。然后,我们通过一串参数的形式将参数传递到构造函数中。这样,我们既可以通过字段名访问元素,也可以用索引访问元素。
from collections import namedtuple
ToDo = namedtuple('ToDo', 'date content priority') t = ToDo(12, 'null', 1) print(t.date) print(t[1]) # 输出: # 12 # null
20
python常用英文单词
![](/skin/haowen/images/icon_star.png)
![](/skin/haowen/images/icon_star.png)
![](/skin/haowen/images/icon_star.png)
![](/skin/haowen/images/icon_star.png)