создание функции для возврата словаря с ключами в качестве заданных делителей и значениями, взятыми из диапазона

#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: []}