给我看一些很酷的python列表理解

chr*_*ant 14 python algorithm list-comprehension

python和其他一些(功能)编程语言的主要优势之一是列表理解.它们允许程序员在一行中编写复杂的表达式.它们最初可能会令人困惑,但如果习惯了语法,那么它比嵌套复杂的循环要好得多.

话虽如此,请与我分享一些列表理解的最酷用法.(通过酷,我只是意味着有用)它可能是一些编程比赛,或生产系统.

例如:要进行矩阵的转置 mat

>>> mat = [
...        [1, 2, 3],
...        [4, 5, 6],
...        [7, 8, 9],
...       ]

>>> [[row[i] for row in mat] for i in [0, 1, 2]]
[[1, 4, 7], [2, 5, 8], [3, 6, 9]]
Run Code Online (Sandbox Code Playgroud)

请包括表达式的说明及其使用位置(如果可能).

ker*_*ger 16

很多人不知道Python允许你使用以下方法过滤列表推导的结果if:

>>> [i for i in range(10) if i % 2 == 0]
[0, 2, 4, 6, 8]
Run Code Online (Sandbox Code Playgroud)


Nic*_*son 9

我经常使用理解来构建dicts:

my_dict = dict((k, some_func(k)) for k in input_list)
Run Code Online (Sandbox Code Playgroud)

注意Python 3有dict理解,所以这变成:

my_dict = {k:some_func(k) for k in input_list}
Run Code Online (Sandbox Code Playgroud)

用于从元组列表中构造类似CSV的数据:

data = "\n".join(",".join(x) for x in input)
Run Code Online (Sandbox Code Playgroud)

实际上不是列表理解,但仍然有用:从"切割点"列表中生成范围列表:

ranges = zip(cuts, cuts[1:])
Run Code Online (Sandbox Code Playgroud)


Mar*_*ers 8

要进行矩阵的转置mat:

>>> [list(row) for row in zip(*mat)]
[[1, 4, 7], [2, 5, 8], [3, 6, 9]]
Run Code Online (Sandbox Code Playgroud)

  • @Glenn这是一个非常广泛的概括.鉴于理解是表达循环的一种更简洁的方式,如果简洁总是坏的,你应该总是将它们扩展为循环. (7认同)
  • `map(list,zip(*mat))`有点terser(虽然不是列表理解). (3认同)

Gru*_*rig 8

要展平列表列表:

>>> matrix = [[1,2,3], [4,5,6]]
>>> [x for row in matrix for x in row]
[1, 2, 3, 4, 5, 6]
Run Code Online (Sandbox Code Playgroud)

  • 或者只是sum(矩阵,[]).:) (4认同)

nei*_*eil 8

如果"酷"意味着疯狂,我喜欢这个:

def cointoss(n,t):
    return (lambda a:"\n".join(str(i)+":\t"+"*"*a.count(i) for i in range(min(a),max(a)+1)))([sum(randint(0,1) for _ in range(n)) for __ in range(t)])

>>> print cointoss(20,100)
3:    **
4:    ***
5:    **
6:    *****
7:    *******
8:    *********
9:    *********
10:   ********************
11:   *****************
12:   *********
13:   *****
14:   *********
15:   *
16:   **
Run Code Online (Sandbox Code Playgroud)

n和t控制每次测试的硬币投掷次数和测试运行的次数,并绘制分布.