добавление словарных данных в набор в цикле python for - PullRequest
0 голосов
/ 07 апреля 2020

Я борюсь с этим, совершенно новым, работая с кортежами и словарями. Я извлекаю данные из моих моделей и хочу получить комбинацию массивов, которая выглядит следующим образом:

{'Home': {'completed': '2', 'ongoing': '3'}, 'Lenan School': {'completed': '1', 'ongoing': '0'}, 'test site': {'completed': '1', 'ongoing': '3'}, 'Juala': {'completed': '0', 'ongoing': '0'}}

Мой код выглядит следующим образом;

qua_sites = quarantine_sites.objects.all().order_by('site_name')
ongoing_cases = {}
completed_cases = []
combinded_array = myDict()
for qua_site in qua_sites:
    qua_completed_contacts = quarantine_contacts.objects.filter(quarantine_site_id = qua_site.id).filter(created_at__gte = date.today()- timedelta(days=14)).count()
    qua_ongoing_contacts = quarantine_contacts.objects.filter(quarantine_site_id = qua_site.id).filter(created_at__lte = date.today()- timedelta(days=14)).count()

    combinded_array.add('ongoing',str(qua_ongoing_contacts))
    combinded_array.add('completed',str(qua_completed_contacts))
    print("------")
    print(combinded_array)

    ongoing_cases[qua_site.site_name] = combinded_array
    print(ongoing_cases)

Combined_array продолжает перезаписываться последнее значение. Мой вывод на печать такой:

------
{'completed': '2', 'ongoing': '3'}
{'Home': {'completed': '2', 'ongoing': '3'}}
------
{'completed': '1', 'ongoing': '0'}
{'Home': {'completed': '1', 'ongoing': '0'}, 'Juala': {'completed': '1', 'ongoing': '0'}}
------
{'completed': '1', 'ongoing': '3'}
{'Home': {'completed': '1', 'ongoing': '3'}, 'Lenan School': {'completed': '1', 'ongoing': '3'}, 
'Juala': {'completed': '1', 'ongoing': '3'}}
------
{'completed': '0', 'ongoing': '0'}
{'Home': {'completed': '0', 'ongoing': '0'}, 'Lenan School': {'completed': '0', 'ongoing': '0'}, 
'test site': {'completed': '0', 'ongoing': '0'}, 'Juala': {'completed': '0', 'ongoing': '0'}}

Как мне получить желаемую комбинацию массивов, как в примере выше. Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 07 апреля 2020

Списки в Python передаются по ссылке, поэтому все элементы в 'текущий_каталогах' ссылаются на один и тот же экземпляр списка, поэтому значения были перезаписаны.

Вы должны делать копию 'combinded_array' на каждой итерации:

    ongoing_cases[qua_site.site_name] = combinded_array.copy()
1 голос
/ 07 апреля 2020

Проблема в том, что у вас есть только один объект myDict, и вы продолжаете добавлять ссылки на этот же объект в ongoing_cases, а затем изменяете его. Это эффективно изменяет значение всех записей в ongoing_cases (потому что они ссылаются на один и тот же объект).

Чтобы исправить это, создайте новый объект (combinded_array = myDict()) внутри l oop.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...