#python #loops #dictionary
Вопрос:
Я врезался в стену. Я пытаюсь написать функцию, которая будет принимать три ввода: делители(список), нижний и верхний (где верхний>=нижний) и возвращать словарь, ключи которого являются элементами делителей и значения которых представляют собой список чисел между нижним и верхним (включая верхнее значение), которые делятся на соответствующий делитель ( если ни одно число в диапазоне не делится на определенный делитель, значение этого ключа делителя в словаре должно быть пустым списком (возвращаемый ключ:[]).
Это моя попытка:
def create_divisor_dict(divisor,lower,upper):
l=lower
u=upper 1
d=divisor
dict={}
r=range(l,u)
for i in r:
for j in d:
if i % j == 0:
dict[j]= i
else:
dict[j]=[]
return (dict)
и вернулся после тестирования
In: create_divisor_dict([1,2,5],2,4)
Out: {1: 4, 2: 4, 5: []}
и должен вернуться
Out: {1:[2,3,4],2:[2,4],5:[]}
Я тоже пытался:
def create_divisor_dict(divisor,lower,upper):
l=lower
u=upper 1
r=range(l,u)
d=divisor
dict={}
for a in r:
for b in d:
if a % b == 0:
dict[b].append(a)
else:
dict[b]=[]
return (dict)
и получил KeyError: 1
И попытался:
def create_divisor_dict(divisor,lower,upper):
l=lower
u=upper 1
r=range(l,u)
DicDivisor=dict.fromkeys(divisor)
for a in r:
for key in DicDivisor:
if a % key == 0:
DicDivisor[key].append(a)
else:
DicDivisor[key]=[]
return (DicDivisor)
получение AttributeError: 'NoneType' object has no attribute 'append'
Спасибо за любую оказанную помощь.
Ответ №1:
Если вы заранее знаете, что вам всегда нужен (по крайней мере) пустой список в результате, вам будет намного проще сначала создать полный словарь с пустыми списками, а затем заполнить его.
def create_divisor_dict(divisor, lower, upper):
result = {d:[] for d in divisor}
for d in divisor:
for i in range(lower, upper 1):
if i % d == 0:
result[d].append(i)
return result
>>> create_divisor_dict([1,2,5], 2, 4)
{1: [2, 3, 4], 2: [2, 4], 5: []}
Комментарии:
1. Спасибо за быстрый ответ и совет!
Ответ №2:
Вот попробуй это. Создайте словарь с пустыми списками в качестве значений и добавляйте значения по мере выполнения итерации
def create_divisor_dict(divisor,lower,upper):
l=lower
u=upper 1
d=divisor
r=range(l,u)
dict1={j:[] for j in d}
for i in r:
for j in d:
if i % j ==0:
dict1[j].append(i)
return (dict1)
print(create_divisor_dict([1,2,5],2,4))
Ответ №3:
Вы должны создать пустой список для каждого делителя, затем выполнить цикл по диапазону, и если значение делится на делитель, добавьте его в список.
def create_divisor_dict(divisor,lower,upper):
result = {}
for div in divisor:
lst = []
for num in range(lower, upper 1):
if num % div == 0:
lst.append(num)
result[div] = lst
return result
Sample Output
>>> create_divisor_dict([1,2,5],2,4)
{1: [2, 3, 4], 2: [2, 4], 5: []}
Ответ №4:
Вы можете инвертировать for
циклы и, чтобы значение по умолчанию было пустым списком, вы можете использовать понимание списка для фильтрации делителей (когда все делители будут отфильтрованы, по умолчанию будет пустой список).:
def create_divisors_dict(divisor, lower, upper):
dict_ = {}
for div in divisors:
dict_[div] = [i for i in range(lower, upper 1) if i % div == 0]
return dict_
Обратите внимание, что я изменил dict
dict_
на не затенять ключевое dict
слово, которое также используется для создания словарей в Python.
Пример вывода:
In [6]: create_divisors_dict([1,2,5],2,4)
Out[6]: {1: [2, 3, 4], 2: [2, 4], 5: []}