Python 按字典数组中的多个键分组
Python Group By multiple keys in an array of dictionaries
我在 Python 中有一个像这样的字典数组
{'district': u'd1', 'community': u'commu2', 'month': 8.0, 'county': u'c1', 'year': 2012.0, 'organization': u'org1'}
{'district': u'd2', 'community': u'commu8', 'month': 9.0, 'county': u'c1', 'year': 2012.0, 'organization': u'org2'}
{'district': u'd1', 'community': u'commu4', 'month': 9.0, 'county': u'c1', 'year': 2012.0, 'organization': u'org1'}
{'district': u'd2', 'community': u'commu5', 'month': 8.0, 'county': u'c1', 'year': 2012.0, 'organization': u'org2'}
{'district': u'd2', 'community': u'commu7', 'month': 9.0, 'county': u'c1', 'year': 2012.0, 'organization': u'org2'}
{'district': u'd1', 'community': u'commu3', 'month': 9.0, 'county': u'c1', 'year': 2012.0, 'organization': u'org1'}
{'district': u'd2', 'community': u'commu6', 'month': 8.0, 'county': u'c1', 'year': 2012.0, 'organization': u'org2'}
{'district': u'd1', 'community': u'commu1', 'month': 8.0, 'county': u'c1', 'year': 2012.0, 'organization': u'org1'}
我如何按多个键值分组,例如(地区、月份、年份、组织)并生成这样的非规范化列表?
{'district': u'd1', 'organization': u'org1', 'month': 8.0, 'county': u'c1', 'year': 2012.0, 'community': ['commu1', 'commu2']}
{'district': u'd1', 'organization': u'org1', 'month': 9.0, 'county': u'c1', 'year': 2012.0, 'community': ['commu3', 'commu4']}
{'district': u'd2', 'organization': u'org2', 'month': 9.0, 'county': u'c1', 'year': 2012.0, 'community': ['commu5', 'commu6']}
{'district': u'd2', 'organization': u'org2', 'month': 8.0, 'county': u'c1', 'year': 2012.0, 'community': ['commu7', 'commu8']}
编辑:我的数据库 TABLE 感兴趣的列是
DISTRICT, COMMUNITY, DATE, ORGANIZATION, COMMUNITY
我正在使用 Django 的 ORM 获取上述格式 1 的数据,但我确实需要格式 2 的数据
我的 Django ORM 提取看起来像这样
list(ActivityReport.objects.all().
values('date').\
extra(select={'year': "EXTRACT(year FROM date)"}).\
extra(select={'month': "EXTRACT(month FROM date)"}).\
values('organization' ,'year','month', 'district', 'community'))
我的 Django 模型看起来像这样
class MyModel(models.Model):
organization = models.CharField(max_length=200)
district = models.CharField(max_length=200)
community = models.CharField(max_length=200, null=True)
date = models.DateField(default=datetime.date.today)
在我们 discussion in chat 之后,我们知道这里有一些额外的限制:传入的数据是这种格式,它按原样保存到数据库中,建议的解决方案是对其进行迭代以进行按摩在将其提供给用户之前在视图处理期间使用它。
从性能方面来说,如果社区是外键关系,反映它是一对多的,这可能会更好,因此这可能不是最具扩展性的解决方案。注意事项,这是我的建议:
>>> # data is your original dict
>>> output = {}
>>> for row in data:
... key = (row['month'], row['year'], row['district'], row['organization'])
... if key in output:
... output[key].append(row['community'])
... else:
... output[key] = [row['community']]
...
>>> output
{(9.0, 2012.0, u'd1', u'org1'): [u'commu4', u'commu3'], (8.0, 2012.0, u'd2', u'org2'): [u'commu5', u'commu6'], (9.0, 2012.0, u'd2', u'org2'): [u'commu8', u'commu7'], (8.0, 2012.0, u'd1', u'org1'): [u'commu2', u'commu1']}
这里的想法是将一对一数据用作元组,它是不可变的,因此可以用作字典键,然后创建从它到社区列表的映射。如果映射已经存在,则附加到列表,否则创建它。过一遍后,数据如图
如果存在其他一对多关系,希望这种技术可以适用于真实数据集或什至适用于其他列表。
我在 Python 中有一个像这样的字典数组
{'district': u'd1', 'community': u'commu2', 'month': 8.0, 'county': u'c1', 'year': 2012.0, 'organization': u'org1'}
{'district': u'd2', 'community': u'commu8', 'month': 9.0, 'county': u'c1', 'year': 2012.0, 'organization': u'org2'}
{'district': u'd1', 'community': u'commu4', 'month': 9.0, 'county': u'c1', 'year': 2012.0, 'organization': u'org1'}
{'district': u'd2', 'community': u'commu5', 'month': 8.0, 'county': u'c1', 'year': 2012.0, 'organization': u'org2'}
{'district': u'd2', 'community': u'commu7', 'month': 9.0, 'county': u'c1', 'year': 2012.0, 'organization': u'org2'}
{'district': u'd1', 'community': u'commu3', 'month': 9.0, 'county': u'c1', 'year': 2012.0, 'organization': u'org1'}
{'district': u'd2', 'community': u'commu6', 'month': 8.0, 'county': u'c1', 'year': 2012.0, 'organization': u'org2'}
{'district': u'd1', 'community': u'commu1', 'month': 8.0, 'county': u'c1', 'year': 2012.0, 'organization': u'org1'}
我如何按多个键值分组,例如(地区、月份、年份、组织)并生成这样的非规范化列表?
{'district': u'd1', 'organization': u'org1', 'month': 8.0, 'county': u'c1', 'year': 2012.0, 'community': ['commu1', 'commu2']}
{'district': u'd1', 'organization': u'org1', 'month': 9.0, 'county': u'c1', 'year': 2012.0, 'community': ['commu3', 'commu4']}
{'district': u'd2', 'organization': u'org2', 'month': 9.0, 'county': u'c1', 'year': 2012.0, 'community': ['commu5', 'commu6']}
{'district': u'd2', 'organization': u'org2', 'month': 8.0, 'county': u'c1', 'year': 2012.0, 'community': ['commu7', 'commu8']}
编辑:我的数据库 TABLE 感兴趣的列是
DISTRICT, COMMUNITY, DATE, ORGANIZATION, COMMUNITY
我正在使用 Django 的 ORM 获取上述格式 1 的数据,但我确实需要格式 2 的数据
我的 Django ORM 提取看起来像这样
list(ActivityReport.objects.all().
values('date').\
extra(select={'year': "EXTRACT(year FROM date)"}).\
extra(select={'month': "EXTRACT(month FROM date)"}).\
values('organization' ,'year','month', 'district', 'community'))
我的 Django 模型看起来像这样
class MyModel(models.Model):
organization = models.CharField(max_length=200)
district = models.CharField(max_length=200)
community = models.CharField(max_length=200, null=True)
date = models.DateField(default=datetime.date.today)
在我们 discussion in chat 之后,我们知道这里有一些额外的限制:传入的数据是这种格式,它按原样保存到数据库中,建议的解决方案是对其进行迭代以进行按摩在将其提供给用户之前在视图处理期间使用它。
从性能方面来说,如果社区是外键关系,反映它是一对多的,这可能会更好,因此这可能不是最具扩展性的解决方案。注意事项,这是我的建议:
>>> # data is your original dict
>>> output = {}
>>> for row in data:
... key = (row['month'], row['year'], row['district'], row['organization'])
... if key in output:
... output[key].append(row['community'])
... else:
... output[key] = [row['community']]
...
>>> output
{(9.0, 2012.0, u'd1', u'org1'): [u'commu4', u'commu3'], (8.0, 2012.0, u'd2', u'org2'): [u'commu5', u'commu6'], (9.0, 2012.0, u'd2', u'org2'): [u'commu8', u'commu7'], (8.0, 2012.0, u'd1', u'org1'): [u'commu2', u'commu1']}
这里的想法是将一对一数据用作元组,它是不可变的,因此可以用作字典键,然后创建从它到社区列表的映射。如果映射已经存在,则附加到列表,否则创建它。过一遍后,数据如图
如果存在其他一对多关系,希望这种技术可以适用于真实数据集或什至适用于其他列表。