Добавление элементов списка в словарь 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 шт):
Проблема в этой строке:
a = {}.fromkeys(digits, [])
^^ <- один список в качестве значения для всех ключей словаря
Каждый ключ словаря будет указывать на один и тот же пустой список и добавление элементов в список по любому из ключей словаря будет одновременно пополнять все списки этого словаря. На английском SO разбирают этот кейс и предлагают, например, использовать словарное включение вместо fromkeys. В вашем случае это будет выглядеть так:
a = {k:[] for k in digits}
^^ <- разные списки для разных ключей словаря
Каждый раз увидев конструкцию [] питон создаёт новый пустой список. В словарном включении эта конструкция вызывается в цикле, поэтому получаются разные списки.