我想做一个函数,它需要三个参数:divisors
(一个列表),lower
和upper
,其中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}