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)
我经常使用理解来构建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)
要进行矩阵的转置mat:
>>> [list(row) for row in zip(*mat)]
[[1, 4, 7], [2, 5, 8], [3, 6, 9]]
Run Code Online (Sandbox Code Playgroud)
要展平列表列表:
>>> 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)
如果"酷"意味着疯狂,我喜欢这个:
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控制每次测试的硬币投掷次数和测试运行的次数,并绘制分布.