Как добавить элемент к элементу словаря?
У меня есть такой код:
class Throne:
def __init__(self, fkg, fkggender):
self.fkg = fkg
self.wiknow = fkg
self.all = dict()
self.all[fkg] = fkggender
self.alive = dict()
self.alive[fkg] = True
self.coup = list()
self.parents = dict()
self.children = [[[0 for i in range(5)] for j in range(5)] for k in range(5)]
def new_born(self, fpn, spn, kn1, Gen):
if (fpn in self.all.keys()) and (spn in self.all.keys()):
self.parents[fpn] = self.parents.get(fpn), kn1
self.parents[spn] = self.parents.get(spn), kn1
self.alive[kn1] = True
self.all[kn1] = Gen
else:
print(fsn + ' and ' + ssn + ' are crooks!')
def marry(self, fsn, ssn):
if (fsn in self.all.keys()):
self.all[ssn] = "F"
self.alive[ssn] = True
self.coup.append([fsn, ssn])
elif (ssn in self.all.keys()):
self.all[fsn] = 'M'
self.alive[fsn] = True
self.coup.append([fsn, ssn])
else:
print(fsn + ' and ' + ssn + ' are crooks!')
romanovy = Throne('Mihail Fedorov I', 'M')
romanovy.marry('Mihail Fedorov I', 'Evdokia')
romanovy.new_born('Mihail Fedorov I', 'Evdokia', 'Ilya', 'M')
romanovy.new_born('Mihail Fedorov I', 'Evdokia', 'Dima', 'M')
Больше ошибку не выдает, теперь в new_born
self.parents[fpn] = self.parents.get(fpn), kn1
self.parents[spn] = self.parents.get(spn), kn1
но в parents теперь лежит {'Mihail Fedorov I': ((None, 'Ilya'), 'Dima'), 'Evdokia': ((None, 'Ilya'), 'Dima')}
Как убрать скобки и оставить только {'Mihail Fedorov I': 'Ilya', 'Dima', 'Evdokia': 'Ilya', 'Dima'} где 2 элемента: 'Mihail Fedorov I': 'Ilya', 'Dima' и 'Evdokia': 'Ilya', 'Dima'
Ответы (1 шт):
По порядку:
romanovy = Throne('Mihail Fedorov I', 'M')
при инициализации экземпляра класса Вы создаете пустой словарь self.parents = dict()
romanovy.marry('Mihail Fedorov I', 'Evdokia')
Далее выполняете метод, который никак не затрагивает его содержимое.
romanovy.new_born('Mihail Fedorov I', 'Evdokia', 'Ilya', 'M')
А в следующем методе присваиваете ему список, где первый элемент пытаетесь достать из словаря (а он пуст) self.parents[fpn] = [self.parents[fpn], kn1].
Попробуйте через self.parents.get(fpn, <значение_если_ключа_нет>), либо если словарь пустой вообще не передавайте его в list.
update:
Для добавления имен используйте список/кортеж, что бы не городить лишнюю логику можно использовать изначально в __init__ - self.parents = defaultdict(list), тогда можно без блока if
if not self.parents.get(fpn) and not self.parents.get(spn):
self.parents[fpn] = []
self.parents[spn] = []
self.parents[fpn].append(kn1)
self.parents[spn].append(kn1)