import collections import itertools
一、交换两个变量的值
在 Python 里面交换变量的值,不需要像 C 语言一样用异或操作,并且只需要一行就搞定了。
a, b = 1, 2
a, b = b, a
二、多个变量赋值
在 Python 对多个变量进行赋值是非常方便的,可以在一行内进行各种形式的赋值。
a, b, c = 1, 2, 3
a, b, c = [1, 2, 3]
a, b, c = (2 * i + 1 for i in range(3))
a, (b, c), d = [1, (2, 3), 4]
三、扩展赋值
Python 的技巧非常令人愉悦,例如这种赋值方式。
a, *b, c = [1, 2, 3, 4, 5]
四、列表中负的下标索引方式
这种方式给编程提供了诸多便利。Python 将列表的首尾连接起来了。
a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
# a[-1] 的值为 10,a[-2] 的值为 9
五、列表切片
列表切片功能是一项非常实用的功能。
a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
print(a[2:8]) # 输出 [2, 3, 4, 5, 6, 7]
六、使用负的下标索引来切片
列表可以使用负的索引来进行切片。
a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
print(a[-4:-2]) # 输出 [7, 8]
七、列表切片时使用步长
使用步长可以让 Python 对列表进行切片时跳过其中指定步长的值。
a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
print(a[::2]) # 输出 [0, 2, 4, 6, 8, 10]
print(a[2:8:2]) # 输出 [2, 4, 6]
八、列表切片时使用负的步长
在对列表切片时,可以使用负的步长。
a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
print(a[::-1]) # 输出 [10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
print(a[::-2]) # 输出 [10, 8, 6, 4, 2, 0]
九、对列表切片进行修改
列表切片赋值可以很方便地去修改列表中的某一部分值。
a = [1, 2, 3, 4, 5]
a[2:4] = [0, 0] # a = [1, 2, 0, 0, 5]
a[1:1] = [8, 9] # a = [1, 8, 9, 2, 3, 4, 5]
a[1:-1] = [] # a = [1, 5]
十、对切片进行命名
类似于定义宏,我们可以取个名字方便实际使用。
a = [0, 1, 2, 3, 4, 5]
LASTTHREE = slice(-3, None, None)
print(a[LASTTHREE]) # 输出 [3, 4, 5]
十一、枚举列表中的索引和值
a = ['Hello', 'world', '!']
for i, x in enumerate(a):
print('{}: {}'.format(i, x))
十二、枚举字典中的 key 和 value
m = {'a': 1, 'b': 2, 'c': 3, 'd': 4}
for k, v in m.items():
print('{}: {}'.format(k, v))
十三、拆分和重组列表
a = [1, 2, 3]
b = ['a', 'b', 'c']
z = zip(a, b) # [(1, 'a'), (2, 'b'), (3, 'c')]
print(list(zip(*z))) # [(1, 2, 3), ('a', 'b', 'c')]
十四、对列表进行分组
a = [1, 2, 3, 4, 5, 6]
group_adjacent = lambda a, k: zip(*([iter(a)] * k))
print(group_adjacent(a, 3)) # [(1, 2, 3), (4, 5, 6)]
print(group_adjacent(a, 2)) # [(1, 2), (3, 4), (5, 6)]
十五、交换字典的 key 和 value
m = {'a': 1, 'b': 2, 'c': 3, 'd': 4}
print(dict(zip(m.values(), m.keys())))
# 输出 {1: 'a', 2: 'b', 3: 'c', 4: 'd'}
十六、对列表进行降维
a = [[1, 2], [3, 4], [5, 6]]
result = list(itertools.chain.from_iterable(a))
print(result) # [1, 2, 3, 4, 5, 6]
十七、构造一个生成器
g = (x ** 2 for x in range(10))
print(next(g)) # 0
print(next(g)) # 1
print(next(g)) # 4
十八、构造一个字典
m = {x: x ** 2 for x in range(5)}
print(m) # {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}
十九、用字典的方式来交换字典的 key 和 value
m = {'a': 1, 'b': 2, 'c': 3, 'd': 4}
print({v: k for k, v in m.items()})
# 输出 {1: 'a', 2: 'b', 3: 'c', 4: 'd'}
二十、为元组进行命名
Point = collections.namedtuple('Point', ['x', 'y'])
p = Point(x=1.0, y=2.0)
print(p.x) # 1.0
print(p.y) # 2.0
二十一、给字典排序
# 普通字典在旧版本中无序
m = dict((str(x), x) for x in range(10))
# 使用 OrderedDict 保持顺序
m = collections.OrderedDict((str(x), x) for x in range(10))
print(list(m.keys())) # ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
二十二、合并两个字典
x = {'a': 1, 'b': 2}
y = {'b': 3, 'c': 4}
z = {**x, **y}
print(z) # {'c': 4, 'a': 1, 'b': 3}
二十三、使用 lambda 来便捷创建函数
add = lambda x, y: x + y
print(add(5, 3)) # 8
二十四、反转一个字符串
a = "abcdefgh"
print("Reverse is", a[::-1]) # hgfedcba
二十五、矩阵转置
mat = [[1, 2, 3], [4, 5, 6]]
print(list(zip(*mat))) # [(1, 4), (2, 5), (3, 6)]
二十六、字符串连接
a = ['my', 'life', 'is', 'pure']
print(' '.join(a)) # my life is pure
二十七、字符串重复生成
a = 'python' * 5
print(a) # pythonpythonpythonpythonpython
二十八、字符串转为数组
a = "my life is brilliant"
result = a.split()
print(result) # ['my', 'life', 'is', 'brilliant']
二十九、多个条件不等式
n = 10
result = 1 < n < 20
print(result) # True
三十、找到列表里出现频率最高的值
test = [1, 2, 3, 4, 2, 2, 3, 1, 4, 4, 4]
print(max(set(test), key=test.count)) # 4

