Python: обновить значение словаря в списке в другом списке словарей. - PullRequest
0 голосов
/ 05 мая 2020

Извинения за запутанный заголовок.

По сути - я просматриваю серию объектов-моделей, извлекая дату и название рынка, чтобы подготовиться к графику.

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

def getData():
    projects = Opportunity.objects.all()
    markets = []

    total = {
        'marketname': "Total",
        'data': []
    }

    for x in projects:
        d = datetime.date(x.datecreated).strftime('%b-%Y')

        keytotaldate = ""
        keydate = ""

        market = x.market.all()[0].marketname


    # Check to see if market exists in list
        if not any(c.get('marketname', None) == market for c in markets):
            newobj = {
                'marketname': market,
                'data': []
            }
            newdateobj = {
                'date': d,
                'count': 1
            }
            newobj['data'].append(newdateobj)
            markets.append(newobj)

            keytotaldate = next((s for s in total['data'] if s['date'] == d), None)

            if keytotaldate is not None:
                keytotaldate['count'] += 1

            else:
                newtotaldateobj = {
                    'date': d,
                    'count': 1
                }
                total['data'].append(newtotaldateobj)

        else:

            keymarket = None
            keydate = None

            for n in markets:
                if n['marketname'] == market:
                    keymarket = n
                    break

            for t in markets:
                for m in t['data']:
                    if m['date'] == d:
                        m['count'] += 1
                        keydate = m
                        break


            if keydate is None:
                newdateobj = {
                        'date': d,
                        'count': 1
                    }
                newobj['data'].append(newdateobj)


            keytotaldate = next((u for u in total['data'] if u['date'] == d), None)

            if keytotaldate is not None:
                keytotaldate['count'] += 1
            else:
                newtotaldateobj = {
                    'date': d,
                    'count': 1
                }
                total['data'].append(newtotaldateobj)


    markets.append(total)
    return markets

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

 {'marketname': 'Washington D.C.', 'data': [
        {'date': 'Feb-2019', 'count': 54},
        {'date': 'Feb-2019', 'count': 1},
        {'date': 'Feb-2019', 'count': 1},
        {'date': 'Feb-2019', 'count': 1},
        {'date': 'Feb-2019', 'count': 1},
        {'date': 'Feb-2019', 'count': 1},
        {'date': 'Feb-2019', 'count': 1},
        {'date': 'Feb-2019', 'count': 1},
        {'date': 'Feb-2019', 'count': 1},
        {'date': 'Feb-2019', 'count': 1},
        {'date': 'Feb-2019', 'count': 1},
        {'date': 'Feb-2019', 'count': 1},
        {'date': 'Feb-2019', 'count': 1},
        {'date': 'Feb-2019', 'count': 1},
        {'date': 'Feb-2019', 'count': 1},
        {'date': 'Feb-2019', 'count': 1},
        {'date': 'Feb-2019', 'count': 1},
        {'date': 'Feb-2019', 'count': 1},
        {'date': 'Feb-2019', 'count': 1},
        {'date': 'Feb-2019', 'count': 1},
        {'date': 'Feb-2019', 'count': 1},
        {'date': 'Feb-2019', 'count': 1},
        {'date': 'Feb-2019', 'count': 1},
        {'date': 'Feb-2019', 'count': 1},
        {'date': 'Feb-2019', 'count': 1},
        {'date': 'Feb-2019', 'count': 1},
        {'date': 'Feb-2019', 'count': 1},
        {'date': 'Feb-2019', 'count': 1},
        {'date': 'Feb-2019', 'count': 1},
        {'date': 'Mar-2019', 'count': 1},
        {'date': 'Mar-2019', 'count': 1},
        {'date': 'Mar-2019', 'count': 1},
        {'date': 'Mar-2019', 'count': 1},
        {'date': 'Mar-2019', 'count': 1},
        {'date': 'Mar-2019', 'count': 1},
        {'date': 'Mar-2019', 'count': 1},
        {'date': 'Mar-2019', 'count': 1},
        {'date': 'Mar-2019', 'count': 1},
        {'date': 'Mar-2019', 'count': 1},
        {'date': 'Mar-2019', 'count': 1},
        {'date': 'Mar-2019', 'count': 1},
        {'date': 'Mar-2019', 'count': 1},
        {'date': 'Mar-2019', 'count': 1},
        {'date': 'Mar-2019', 'count': 1},
        {'date': 'Mar-2019', 'count': 1},
        {'date': 'Mar-2019', 'count': 1},
        {'date': 'Mar-2019', 'count': 1},
        {'date': 'Apr-2019', 'count': 1},
        {'date': 'Apr-2019', 'count': 1},
        {'date': 'Apr-2019', 'count': 1},
        {'date': 'Apr-2019', 'count': 1},
        {'date': 'Apr-2019', 'count': 1},
        {'date': 'Apr-2019', 'count': 1},
        {'date': 'Apr-2019', 'count': 1},
        {'date': 'Apr-2019', 'count': 1},
        {'date': 'Apr-2019', 'count': 1},
        {'date': 'Apr-2019', 'count': 1},
        {'date': 'Apr-2019', 'count': 1},
        {'date': 'Apr-2019', 'count': 1},
        {'date': 'Apr-2019', 'count': 1},
        {'date': 'Apr-2019', 'count': 1},
        {'date': 'Apr-2019', 'count': 1},
        {'date': 'Apr-2019', 'count': 1},
        {'date': 'Apr-2019', 'count': 1},
        {'date': 'Apr-2019', 'count': 1},
        {'date': 'Apr-2019', 'count': 1},
        {'date': 'Apr-2019', 'count': 1},
        {'date': 'Apr-2019', 'count': 1},
        {'date': 'Apr-2019', 'count': 1},
        {'date': 'Apr-2019', 'count': 1},
        {'date': 'Apr-2019', 'count': 1},
        {'date': 'Apr-2019', 'count': 1},
        {'date': 'Apr-2019', 'count': 1},
        {'date': 'Apr-2019', 'count': 1},
        {'date': 'Apr-2019', 'count': 1},
        {'date': 'Apr-2019', 'count': 1},
        {'date': 'Apr-2019', 'count': 1},
        {'date': 'Apr-2019', 'count': 1},
        {'date': 'Apr-2019', 'count': 1},
        {'date': 'Apr-2019', 'count': 1},
        {'date': 'Apr-2019', 'count': 1},
        {'date': 'Apr-2019', 'count': 1},
        {'date': 'Apr-2019', 'count': 1},
        {'date': 'Apr-2019', 'count': 1},
        {'date': 'Apr-2019', 'count': 1},
        {'date': 'Apr-2019', 'count': 1},
        {'date': 'Apr-2019', 'count': 1},
        {'date': 'Apr-2019', 'count': 1},
        {'date': 'Apr-2019', 'count': 1},
        {'date': 'Apr-2019', 'count': 1},
        {'date': 'Apr-2019', 'count': 1},
        {'date': 'Apr-2019', 'count': 1},
        {'date': 'Apr-2019', 'count': 1},
        {'date': 'Apr-2019', 'count': 1},
        {'date': 'Apr-2019', 'count': 1},
        {'date': 'Apr-2019', 'count': 1},
        {'date': 'Apr-2019', 'count': 1},
        {'date': 'Apr-2019', 'count': 1},
        {'date': 'Apr-2019', 'count': 1},
        {'date': 'Apr-2019', 'count': 1},
        {'date': 'Apr-2019', 'count': 1},
        {'date': 'Apr-2019', 'count': 1},
        {'date': 'Apr-2019', 'count': 1},
        {'date': 'Apr-2019', 'count': 1},
        {'date': 'Apr-2019', 'count': 1},
        {'date': 'Apr-2019', 'count': 1},
        {'date': 'Apr-2019', 'count': 1},
        {'date': 'Apr-2019', 'count': 1},
        {'date': 'Apr-2019', 'count': 1},
        {'date': 'Apr-2019', 'count': 1},
        {'date': 'Apr-2019', 'count': 1},
        {'date': 'Apr-2019', 'count': 1},
        {'date': 'Apr-2019', 'count': 1},
        {'date': 'Apr-2019', 'count': 1},
        {'date': 'Apr-2019', 'count': 1},
        {'date': 'Apr-2019', 'count': 1},
        {'date': 'Apr-2019', 'count': 1},
        {'date': 'Apr-2019', 'count': 1},
        {'date': 'Apr-2019', 'count': 1},
        {'date': 'Apr-2019', 'count': 1},
        {'date': 'Apr-2019', 'count': 1},
        {'date': 'Apr-2019', 'count': 1},
        {'date': 'Apr-2019', 'count': 1},
        {'date': 'Apr-2019', 'count': 1},
        {'date': 'Apr-2019', 'count': 1},
        {'date': 'Apr-2019', 'count': 1},
        {'date': 'Apr-2019', 'count': 1},
        {'date': 'Apr-2019', 'count': 1},
        {'date': 'Apr-2019', 'count': 1},
        {'date': 'Apr-2019', 'count': 1},
        {'date': 'Apr-2019', 'count': 1},
        {'date': 'Apr-2019', 'count': 1},
        {'date': 'Apr-2019', 'count': 1},
        {'date': 'Apr-2019', 'count': 1},
        {'date': 'Apr-2019', 'count': 1},
        {'date': 'May-2019', 'count': 1},
        {'date': 'May-2019', 'count': 1},
        {'date': 'May-2019', 'count': 1},
        {'date': 'May-2019', 'count': 1},
        {'date': 'May-2019', 'count': 1},
        {'date': 'May-2019', 'count': 1},
        {'date': 'May-2019', 'count': 1},
        {'date': 'May-2019', 'count': 1},
        {'date': 'May-2019', 'count': 1},
        {'date': 'May-2019', 'count': 1},
        {'date': 'May-2019', 'count': 1},
        {'date': 'May-2019', 'count': 1},
        {'date': 'May-2019', 'count': 1},
        {'date': 'May-2019', 'count': 1},
        {'date': 'May-2019', 'count': 1},
        {'date': 'Jun-2019', 'count': 1},
        {'date': 'Jun-2019', 'count': 1},
        {'date': 'Jun-2019', 'count': 1},
        {'date': 'Jun-2019', 'count': 1},
        {'date': 'Jun-2019', 'count': 1},
        {'date': 'Jun-2019', 'count': 1},
        {'date': 'Jun-2019', 'count': 1},
        {'date': 'Jun-2019', 'count': 1},
        {'date': 'Jun-2019', 'count': 1},
        {'date': 'Jun-2019', 'count': 1},
        {'date': 'Jun-2019', 'count': 1},
        {'date': 'Jun-2019', 'count': 1},
        {'date': 'Jun-2019', 'count': 1},
        {'date': 'Jun-2019', 'count': 1},
        {'date': 'Jun-2019', 'count': 1},
        {'date': 'Jun-2019', 'count': 1},
        {'date': 'Jun-2019', 'count': 1},
        {'date': 'Jun-2019', 'count': 1},
        {'date': 'Jun-2019', 'count': 1},
        ]},

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

[
 {
  'marketname': 'Chicago',
  'data': 
        [
         {
          'date': 'Jun-2019',
          'count': 3
          },
         {
          'date': 'Jul-2019',
          'count': 1
          }
        ]
 },
 {
  'marketname': 'New York',
  'data': 
        [
         {
          'date': 'Jun-2019',
          'count': 2
          },
         {
          'date': 'Jul-2019',
          'count': 5
          }
        ]
 },
]

Спасибо за уделенное время !!

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