最近打算好好练习下 python, 因此找到一个练习题网站, 打算每周练习 3-5 题吧.
另外, 这个网站其实也还有 Python 的教程, 从基础到高级的知识都有.
Example-1 三位数组合
题目: 有四个数字: 1,2,3,4, 能组成多少个互不相同且无重复数字的三位数? 各是多少?
思路
最简单的方法, 就是穷举法了, 分别求出在百位, 十位, 个位上的数字, 然后剔除出现重复数字的组合, 剩余的就是答案了.
代码实现
直接代码实现如下:
- def create_three_digits(number_start=1, number_end=4):
- '''
- 给定指定数字范围(比如 1 到 4), 求可以组成多少个无重复的三位数
- :param number_start: 起始数字
- :param number_end: 结束数字
- :return: 返回数量, 以及可能的三位数的列表
- '''
- count = 0
- result_list = list()
- for i in range(number_start, number_end + 1):
- for j in range(number_start, number_end + 1):
- for k in range(number_start, number_end + 1):
- if (i != j) and (i != k) and (j != k):
- count += 1
- result_list.append(str(i) + str(j) + str(k))
- return count, result_list
写得更加简便点, 可以采用列表推导式:
- def create_three_digits2(number_start=1, number_end=4):
- '''
- 采用列表推导式实现
- :param number_start:
- :param number_end:
- :return:
- '''
- return [str(i) + str(j) + str(k) for i in range(number_start, number_end + 1) for j in
- range(number_start, number_end + 1) for k in
- range(number_start, number_end + 1) if (i != j) and (i != k) and (j != k)]
输出结果如下, 总共有 24 种不同的排列组合.
- valid count=24, and they are:
- 123
- 124
- 132
- 134
- 142
- 143
- 213
- 214
- 231
- 234
- 241
- 243
- 312
- 314
- 321
- 324
- 341
- 342
- 412
- 413
- 421
- 423
- 431
- 432
当然, 目前这种代码实现的时间复杂度是很高的, 毕竟是三个 for 循环. 如果有更好的解法, 可以在评论留言, 告诉我!
知识点复习 -- 列表推导式
列表推导式 (又称列表解析式) 提供了一种简明扼要的方法来创建列表.
它的结构是在一个中括号里包含一个表达式, 然后是一个 for 语句, 然后是 0 个或多个 for 或者 if 语句. 那个表达式可以是任意的, 意思是你可以在列表中放入任意类型的对象. 返回结果将是一个新的列表, 在这个以 if 和 for 语句为上下文的表达式运行完成之后产生.
用代码表示列表推导式如下:
variable = [out_exp for out_exp in input_list if out_exp == 2]
一个简明的例子如下:
- multiples = [i for i in range(30) if i % 3 is 0]
- print(multiples)
- # Output: [0, 3, 6, 9, 12, 15, 18, 21, 24, 27]
那么, 什么时候最适合用列表推导式呢?
其实是当你需要使用 for 循环来生成一个新列表. 举个例子, 你通常会这样做:
- squared = []
- for x in range(10):
- squared.append(x**2)
这时候, 采用列表推导式最合适:
squared = [x**2 for x in range(10)]
源代码在:
参考文章:
列表推导式(list comprehensions)
来源: https://juejin.im/post/5c4d1a2d6fb9a049ba41f4bd