Python - 同时插入和更新python dict

问题描述 投票:-1回答:3

所以我有一个如下所示的dicts列表:

[{
  'field': {
    'data': 'F1'
  },
  'value': F1Value1,
  'date': datetime.datetime(2019, 3, 1, 0, 0)
}, {
  'field': {
    'data': 'F2'
  },
  'value': F2Value1,
  'date': datetime.datetime(2019, 2, 5, 0, 0)
}, {
  'field': {
    'data': 'F2'
  },
  'value': F2Value2,
  'date': datetime.datetime(2019, 2, 7, 0, 0)
}]

我想要一个看起来像这样的输出:

[
  {
    'F1': [
      {
        'value': F1Value1,
        'date': datetime.datetime(2019, 3, 1, 0, 0)
      }
    ]
  },
  {
    'F2': [
      {
        'value': F2Value1,
        'date': datetime.datetime(2019, 2, 5, 0, 0)
      },
      {
        'value': F2Value2,
        'date': datetime.datetime(2019, 2, 5, 0, 0)
      },
    ]
  }
]

也就是说,我希望每个field.data成为关键,如果它属于同一个领域,它会附加valuedate

注意:我想这样做而不使用for循环(除了循环遍历列表)。我想使用像update()append()等python dict函数。

任何优化的解决方案都会非常有用。

python
3个回答
1
投票

您可以通过iteratelist使用dict并使用defaultdictcollections添加具有唯一键的项目,

>>> from collections import defaultdict
>>> d = defaultdict(list)
>>>
>>> for items in x:
...   d[items['field']['data']].append({
...     'value': items['value'],
...     'date': items['date']
...   })
...
>>> 
>>> import pprint
>>> pprint.pprint(x)
[{'date': datetime.datetime(2019, 3, 1, 0, 0),
  'field': {'data': 'F1'},
  'value': 'F1Value1'},
 {'date': datetime.datetime(2019, 2, 5, 0, 0),
  'field': {'data': 'F2'},
  'value': 'F2Value1'},
 {'date': datetime.datetime(2019, 2, 7, 0, 0),
  'field': {'data': 'F2'},
  'value': 'F2Value2'}]
>>>
>>> pprint.pprint(list(d.items()))
[('F1', [{'date': datetime.datetime(2019, 3, 1, 0, 0), 'value': 'F1Value1'}]),
 ('F2',
  [{'date': datetime.datetime(2019, 2, 5, 0, 0), 'value': 'F2Value1'},
   {'date': datetime.datetime(2019, 2, 7, 0, 0), 'value': 'F2Value2'}])]

1
投票

使用itertools.groupby

from itertools import groupby
from pprint import pprint

result = [{key: [{k: v for k, v in element.items() if k != 'field'} 
                 for element in group]} 
          for key, group in groupby(data, lambda element: element['field']['data'])]

pprint(result)

输出:

[{'F1': [{'date': datetime.datetime(2019, 3, 1, 0, 0), 'value': 'F1Value1'}]},
 {'F2': [{'date': datetime.datetime(2019, 2, 5, 0, 0), 'value': 'F2Value1'},
         {'date': datetime.datetime(2019, 2, 7, 0, 0), 'value': 'F2Value2'}]}]

0
投票

仅使用dict,list和set:

[ 
  { 
    field_data :
      [ 
        { k:v for k, v in thing.items() if k != 'field' }
        for thing in things if thing['field']['data'] == field_data 
      ]
    for field_data in set(thing['field']['data'] for thing in things)
  } 
]
热门问题
推荐问题
最新问题