我正在完成矩阵编码中的练习,并已完成此任务:编写一个过程 all_3_digit_numbers(base,digits),其中输入是正整数基数,digits 是集合 {0, 1,2 , ..., base-1},输出是所有三位数的集合,其中基数为base。我想出了一个解决方案:
def all_3_digit_numbers(base, digits): return {a+b+c for a in [d*base**2 for d in digits] for b in [d*base**1 for d in digits] for c in [d*base**0 for d in digits]}
适合一行。但我认为表达式 d*base**exp 的重复可以合并。所以我也有这个解决方案:
def all_3_digit_numbers(base, digits):
[alist,blist,clist] = [[digit*base**exp for digit in digits] for exp in [0,1,2]]
return {a+b+c for a in alist for b in blist for c in clist}
这更优雅(我猜),但需要额外的表达。我想知道是否有一种方法可以两全其美 - 不需要像第二个解决方案那样在单独的语句中进行变量赋值的理解,但是要添加的数字列表不会像在中那样重复第一个解决方案。
这些中间列表使代码变得非常长。没必要这样:
def all_3_digit_numbers(base, digits):
return {a*base**2 + b*base + c for a in digits for b in digits for c in digits}
如果您想更花哨一点,请使用 itertools :
from itertools import product
def all_3_digit_numbers2(base, digits):
return {a*base**2 + b*base + c for a, b, c in product(digits, repeat=3)}
我是一名优秀的程序员,十分优秀!