Нужен defaultdict со значениями в виде двух списков - PullRequest
0 голосов
/ 11 ноября 2018

В Python я хочу что-то вроде

dict = defaultdict((list,list))

По сути, с каждым ключом я хочу два списка!

С помощью приведенного выше фрагмента я получаю сообщение об ошибке: первый аргумент должен быть вызван. Как мне этого добиться?

Ответы [ 2 ]

0 голосов
/ 11 ноября 2018

Дайте defaultdict в качестве параметра функцию, которая создает ваши пустые списки:

from collections import defaultdict

def pair_of_lists():
    return [[], []]

d = defaultdict(pair_of_lists)

d[1][0].append(3)
d[1][1].append(42)

print(d)
# defaultdict(<function pair_of_lists at 0x7f584a40b0d0>, {1: [[3], [42]]})
0 голосов
/ 11 ноября 2018

Это не какой-то вывод типа, вы просто предоставляете функцию, которая генерирует значение по умолчанию. В то время как int, list, dict без аргумента генерируют 0, [], {}, что часто используется в объявлении defaultdict. В Python нет встроенной функции конструктора для пары списков и т. Д. Так что это просто, как

di = defaultdict(lambda : ([1,2,3], ['a', 'cb']))

Хотя Python допускает кортежи (пары) списков, у вас могут возникнуть некоторые проблемы, например, с хэшированием списка кортежей. Чтобы быть в безопасности, вы можете установить по умолчанию список из двух списков. Обратите внимание, что вы установили определенные списки, пустые или нет, а не тип / конструктор списка. Буквально о настройке значения по умолчанию, а не об объявлении типа - списки Python не типизированы.

from collections import defaultdict
l1 = []
l2 = ["another", "default", "list"]
di = defaultdict(lambda : [ l1, l2] )
print (di[3])
...