Не удалось заполнить словарь при итерации с разделенным кортежем / w Python - PullRequest
0 голосов
/ 16 апреля 2020

Будет полезна некоторая помощь, потому что я не понимаю, что добавить, когда я пытаюсь заполнить словарь, разбивая термины из кортежа.

Здесь кортеж:

for i in tpl_walllg:
    print(i)

(11001, 43.27)
(11003, 5.13)
(11004, 23.62)
(11005, 5.22)

Когда Я повторяю его, разделяя термины и помещая в форму, это работает:

for i in tpl_walllg:
    print("Wall {id} / {lg}m".format(id=i[0], lg=i[1]))

Wall 11001 / 43.27m
Wall 11003 / 5.13m
Wall 11004 / 23.62m
Wall 11005 / 5.22m

Поэтому я решил использовать этот метод, чтобы заполнить предварительно сформированный словарь этим, первым термином кортежа является ' root 'ключ от dict и второй, значение влияет.

for i in tpl_walllg:
    wm[i[0]]['propriétés']['géo']['lg'] = i[1]

Итерация работает, но почему значение одинаково (последняя стена)? Взгляните:

for i in tpl_walllg:
    print(wm[i[0]]['propriétés']['géo']['lg'])

5.22
5.22
5.22
5.22

и введите в форме:

for i in tab_wallID:
    print('The wall n°{id} is {lg}m long'.format(id=i, lg=wm[i]['propriétés']['géo']['lg']))

The wall n°11001 is 5.22m long
The wall n°11003 is 5.22m long
The wall n°11004 is 5.22m long
The wall n°11005 is 5.22m long

Здесь tab_wallID - это просто список wallID.

Ниже, диктонное здание:

wm = {}  # Création d'un dictionnaire (wm : wall matrix)

dic_prop = {'géo': {'ep': float(),  # wall tickness
                    'lg': float(),  # wall lenght
                    'ht': float()  # wall height
                    },
            'méca': {'fck': int(),
                     # characteristic compressive strength of concrete
                     'fyk': int()
                     # characteristic yield strength of reinforcement
                     },
            'spatiale': {}  # not used yet
            } 


for i in tab_wallID:
    wm[i] = {'propriétés': dic_prop,
             'torseurs': dic_comb
             }

1 Ответ

0 голосов
/ 17 апреля 2020

Это происходит потому, что при создании словаря wm вы указываете на тот же объект dic_prop. Вот почему при зацикливании один и тот же словарь свойств обновляется последовательно с каждым новым i[1].

Одним из способов решения этой проблемы было бы изменение способа построения wn на литерал словаря, что-то вроде:

for i in tab_wallID:
    wm[i] = {'propriétés': {'géo': {'lg': float()}}}

Редактировать:

Другим способом может быть копирование словаря dict_prop каждый раз, когда он назначен клавише, например:

import copy

for i in tab_wallID:
    wm[i] = {'propriétés': copy.deepcopy(dic_prop)}
...