2017-08-03 69 views
0

我有一组记录,我想在两个单独的字段上组合在一起。每条记录都是一个Python字典。其中一个字段是日期值,另一个是数字字段。 IE中:现在Python组记录在一起字段

h = [{'date': 20170728, 'group': 121, ...}, 
    {'date': 20170729, 'group': 131, ...}, 
    ...] 

,如果我想组某些群体一起,说任何组是在[123,134,145],但具有相同的日期,他们组合在一起,但每另一组被分组一起自己,我会怎么做到这一点?

我用下面的代码:

grouped_list = [] 
for date, items in groupby(h, key=itemgetter('date'): 
    g = list(items) 
    grouped_list.append(g) 

,我正在寻找的输出如下:

grouped_list = [ 
       [records that have a distinct date value and group], 
       [records that have a distinct date but are in the group [123, 134, 145], 
       etc.] 

在组123,134的记录,145不应该在grouped_list中有各自的列表。应该将它们组合在一个列表中。

+0

你能否提供输出你”的例子重新找? – cowbert

+0

使用'grouped_records = sorted(h,key = lambda x:x ['date'])来排序列表'是否符合您的需求?或者你在找别的东西吗? –

+0

请注意'collections.groupby'组连续迭代器。由于字典的迭代顺序是不可预知的,所以这可能不是正确的方法 –

回答

0

您可以编写一个自定义函数来计算键,以便将记录的,是这样的:

from itertools import groupby 

records = [ 
     {'date': 20170728, 'group': 121}, 
     {'date': 20170729, 'group': 131}, 
     {'date': 20170729, 'group': 134}, 
     {'date': 20170729, 'group': 145}, 
] 
grouped_groups = [123, 134, 145] 

def compute_groupby_key(entry): 
     return "%d-%d" % (
      entry['date'], 
      grouped_groups[0] if entry['group'] in grouped_groups else entry['group'] 
    ) 

grouped_records = [list(entries) for key, entries in groupby(records, compute_groupby_key)] 

这里grouped_records包含:

[ 
    [{'date': 20170728, 'group': 121}], 
    [{'date': 20170729, 'group': 131}], 
    [{'date': 20170729, 'group': 134}, {'date': 20170729, 'group': 145}]] 
]