创建除数字典



我想做一个函数,它需要三个参数:divisors(一个列表),lowerupper,其中upper >= lower。我希望函数返回一个字典,其中键是除数,其值是可被相应除数整除的范围(下界和上界)之间的数字列表。

这是我最初的尝试:

def create_divisors_dict(divisors, lower, upper):
list = []
dict = {}
for i in range(len(divisors)):
for j in range(lower, upper + 1):
if j % divisors[i] == 0:
list.append(j)
dict[i] = list
else:
dict[i] = []

return dict
print(create_divisors_dict([1, 2, 5], 2, 4))

预期输出为:

{1: [2, 3, 4], 2: [2, 4], 5: []}

然而,我一直得到一些奇怪的输出,这是我得到的最接近我上面所示的代码:

{1: [2, 3, 4, 2, 4], 2: [2, 3, 4, 2, 4], 5: []}

有人能帮帮我,告诉我问题在哪里,或者我做错了什么?

这是另一个选择,构建在你发布的代码:

def create_divisors_dict(divisors, lower, upper):
d = {}
for divisor in divisors:
d[divisor] = []
for n in range(lower, upper + 1):
if n % divisor == 0:
d[divisor].append(n)
return d

或者使用一点列表推导:

def create_divisors_dict(divisors, lower, upper):
d = {}
for divisor in divisors:
d[divisor] = [n for n in range(lower, upper + 1) if n % divisor == 0]
return d

或者甚至结合字典和列表的推导式:

def create_divisors_dict(divisors, lower, upper):
return {d: [n for n in range(lower, upper + 1) if n % d == 0] for d in divisors}

其中任何一个都将导致:

print(create_divisors_dict([1, 2, 5], 2, 4))
{1: [2, 3, 4], 2: [2, 4], 5: []}

@Carci已经解释了你的一个bug,另一个是你没有很好的理由重置dict[i] = [],第三个是你没有使用除数,而是使用它们的索引作为结果键(如果你对除数进行正常迭代就不会发生)。

无论如何,这里有一个简短而有效的解决方案:

def create_divisors_dict(divisors, lower, upper):
return {d: [*range(lower + -lower % d, upper + 1, d)]
for d in divisors}

或者对范围内的第一个倍数使用不同的表达式:

def create_divisors_dict(divisors, lower, upper):
return {d: [*range(-(-lower // d) * d, upper + 1, d)]
for d in divisors}

相关内容

  • 没有找到相关文章

最新更新