使用itertools groupby对列表进行排序并合并词典

2024-09-25 16:22:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我希望使用python intertools groupby创建一个函数,将小列表分组到一个较大的列表中。首先是一个具有以下结构的不同数据点的列表(称为sortedData)

[
  [location, date, {item:quantity}],
  [location2, date, {item2:quantity2}],
  ...
]

我试图对它们进行分组,以便每个位置/日期组合都有一个包含所有项目和数量的字典,并且这些列表按位置分组。下面是一个例子:

^{pr2}$

到目前为止,我得到的是这段代码,但是我很难理解如何使用创建的组,因为它不是iterable项。现在它给出了一个空白列表,尽管它似乎应该附加一些东西

def compileData(sortedData):    
    from itertools import groupby
    for key, locationGroup in groupby(sortedData, lambda x: x[0]):
        locationList=[]
        bigList=[]
        for date in locationGroup:
            locationList.append(date)
        locationList.append(locationGroup)
        for key, bigList in groupby(locationGroup, lambda x: x[1]):
            datePlace=[key[0],key[1],{}]
            for date in locationGroup:
                datePlace[2]=dict(list(date[2].items())+list(datePlace[2].items()))
                bigList.append(datePlace)
        return bigList  

告诉我你的想法,如果你对如何解决这个问题有更好的想法,请告诉我。我递归地写了它,但是我使用它的文件太长,所以太慢了。在


Tags: lambdakeyin列表fordateitemslist
1条回答
网友
1楼 · 发布于 2024-09-25 16:22:56

我想这是你想要的:

from itertools import groupby
from operator import itemgetter

def update_with_ignore(a, b):
    '''Copy only new entries from B to A'''
    for k,v in b.items():
        a.setdefault(k,v)

def compileData(sortedData):
    result = []
    sortedData = sorted(sortedData, key=itemgetter(0,1))
    for location, group in groupby(sortedData, key=itemgetter(0)):
        l = []
        for date, group in groupby(group, key=itemgetter(1)):
            d = {}
            for datum in group:
                update_with_ignore(d, datum[2])
            l.append([location, date, dict(d)])
        result.append(l)
    return result


in_data = [
    ["Maine", "01062016", {"apple":5}],
    ["Maine", "02042016", {"apple":3}],
    ["Maine", "01062016", {"orange":2}],
    ["Vermont", "01032016", {"peach":3}],
    ["Maine", "02042016", {"peach":2}],
]
out_data = compileData(in_data)
assert out_data == [
 [['Maine', '01062016', {'apple': 5, 'orange': 2}],
  ['Maine', '02042016', {'apple': 3, 'peach': 2}]],
 [['Vermont', '01032016', {'peach': 3}]]]

in_data = [
    ["Maine", "01062016", {"apple":5}],
    ["Maine", "01062016", {"apple":4}],
    ["Maine", "02042016", {"apple":3}],
]
out_data = compileData(in_data)
assert out_data == [
 [['Maine', '01062016', {'apple': 5}],
  ['Maine', '02042016', {'apple': 3}]]]

相关问题 更多 >