我正在完成编码矩阵的练习,并完成了这项任务:编写一个程序all_3_digit_numbers(base,digits),其中input是一个正整数基数,数字是集合{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}
这更优雅(我猜),但需要额外的表达。我想知道是否有一种方法可以充分利用两个世界 - 这种理解并不需要在单独的语句中进行变量赋值,因为它是第二种解决方案,但是要添加的数字列表不是在第一个解决方案中重复。
答案 0 :(得分:1)
这些中间列表使代码真的很长。没必要:
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)}