Добавление элементов списка в словарь Python

Всем доброго времени суток. Пытаюсь добавить элементы списка в словарь по определённому признаку. Задача состоит в поразрядной сортировке массива. Количество ключей словаря - это количество разрядов в числах, которые не повторяются. При попытке сортировки элементов в словарь добавляется весь список, причём одновременно по всем ключам. Как это исправить?

def Radix_Sort(arr, n):

    digits = Digits(arr, n)

    a = {}.fromkeys(digits, [])


    for el in arr:
        a[int((el % pow(10,n))/pow(10, n-1))].append(el)
    
    print(a[2])
    return arr


def Digits(arr, n):
    digits = []

    for num in arr:
        digit = int((num % pow(10,n))/pow(10, n-1)) #int(str(num)[len(str(num))-n])
        if not digit in digits:
            digits.append(digit)
    return digits

def main():
    a = []
    size = int(input("Введите размер массива: "))

    print("Введите элементы массива: ")

    for i in range(size):
        a.append(int(input()))

    a = Radix_Sort(a, 1)

    return

main()

Ответы (1 шт):

Автор решения: CrazyElf

Проблема в этой строке:

a = {}.fromkeys(digits, [])
                        ^^ <- один список в качестве значения для всех ключей словаря

Каждый ключ словаря будет указывать на один и тот же пустой список и добавление элементов в список по любому из ключей словаря будет одновременно пополнять все списки этого словаря. На английском SO разбирают этот кейс и предлагают, например, использовать словарное включение вместо fromkeys. В вашем случае это будет выглядеть так:

a = {k:[] for k in digits}
       ^^ <- разные списки для разных ключей словаря

Каждый раз увидев конструкцию [] питон создаёт новый пустой список. В словарном включении эта конструкция вызывается в цикле, поэтому получаются разные списки.

→ Ссылка