几个Python代码片段

1,071 阅读2分钟
原文链接: zhuanlan.zhihu.com

写Python写得兴头上,献上几个我常用的Python代码小片段,一般人我不告诉他...[doge]

  • 矩阵转置

除了用NumPy,通常使用大可不必杀鸡用牛刀。可以用列表解析:

A = [[1, 2, 3, 4],
     [5, 6, 7, 8]]

[[r[c] for r in A] for c in range(len(A[0]))]

# output: [[1, 5], [2, 6], [3, 7], [4, 8]]

呐,也可以这样:

trans_mat = lambda A: map(list, zip(*A))
list(trans_mat(A))

# output: [[1, 5], [2, 6], [3, 7], [4, 8]]
  • 字典的Key与Value对调
m = {'A': 1, 'B': 2, 'C': 3}
invert_map_key_value = lambda m: dict(zip(m.values(), m.keys()))
invert_map_key_value(m)

# output: {1: 'A', 2: 'B', 3: 'C'}
  • 剔除分隔符

剔除分隔符通常用split

''.join('A|B|C|D|E|F|G'.split('|'))

# output: 'ABCDEFG'

我更喜欢用itertools.islice,因为可以节选字符串:

import itertools


''.join(itertools.islice('A|B|C|D|E|F|G', 6, None, 2))
# output: 'DEFG'

''.join(itertools.islice('A|B|C|D|E|F|G', 0, None, 2))
# output: ''ABCDEFG'
  • 捋平列表

这个是终极版的捋平列表方法,支持任意层次的捋平,或全部捋平。

lst = [1, 2, [3, 4], [[5, 6], [8, 9, [19, 29, 39], 900], 10], 10, [8], 11, 12, 13, [14, 15]]
flatten = (lambda lst, lv=None:
    [elem2 for elem1 in lst for elem2 in flatten(elem1, lv if lv is None else lv-1)]
    if type(lst) is list and (lambda lv: 0 if lv is None else lv)(lv) >= 0 else [lst])

flatten(lst)
# output: [1, 2, 3, 4, 5, 6, 8, 9, 19, 29, 39, 900, 10, 10, 8, 11, 12, 13, 14, 15]

flatten(lst, 1)
# output: [1, 2, 3, 4, [5, 6], [8, 9, [19, 29, 39], 900], 10, 10, 8, 11, 12, 13, 14, 15]

flatten(lst, 2)
# output: [1, 2, 3, 4, 5, 6, 8, 9, [19, 29, 39], 900, 10, 10, 8, 11, 12, 13, 14, 15]

flatten(lst, 3)
# output: [1, 2, 3, 4, 5, 6, 8, 9, 19, 29, 39, 900, 10, 10, 8, 11, 12, 13, 14, 15]

写Python还是很有意思的。改天兴致来了再发点吧~~~