python理解巩固生成all_3_digit_numbers
python comprehension consolidation to generate all_3_digit_numbers
我正在完成矩阵编码中的练习,并完成了这项任务:编写一个过程 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)}
我正在完成矩阵编码中的练习,并完成了这项任务:编写一个过程 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)}