2015-06-18 53 views
0

我正在努力理解itertools.groupby的工作原理。我有一个excel电子表格,第一列的交付日期是第二列的目的地Lat,第三列的目的地是Lon。早些时候,我能够得到帮助,将相同的日期分组到大数组的子阵列中他们。这是执行它的代码。Itertools Groupby问题

with xlrd.open_workbook(file_location) as workbook: 
    sheet = workbook.sheet_by_index(0) 

    Dates = (sheet.cell_value(i,0) for i in range(sheet.nrows)) 
    Day = [list(group) for key, group in itertools.groupby(Dates)] 

现在我需要更进一步,将Lat组合到一个数组中,并将Lon组合到另一个数组中,但将它们分组到一天中。我试过将上面列出的代码与类似这样的东西结合起来,但我不知道如何将Lat和Lon变量合并到itertools groupby函数中。

with xlrd.open_workbook(file_location) as workbook: 
    sheet = workbook.sheet_by_index(0) 

    for i in range(sheet.nrows): 
     Lat = (sheet.cell_value(i,2) for i in range(sheet.nrows)) 
     DeliveryX = [list(group) for key, group in itertools.groupby(Dates)] 
     Lon = (sheet.cell_value(i,3) for i in range(sheet.nrows)) 
     DeliveryY = [list(group) for key, group in itertools.groupby(Dates)] 

回答

0

groupby需要key参数在给定列表来决定如何组的值。你会做基本的元组像一个迭代:

t = ((lat, lon, date), (lat, lon, date), ...) 

您可以通过调用itertools.izip(Lat, Lon, Dates)实现这一目标。然后,通过比较第三个字段将这个列表分组,并提取第一个和第二个字段,您可以编写

lats = [[i[0] for i in g] for k, g in groupby(t, key=lambda x: x[2])] 
lats = [[i[1] for i in g] for k, g in groupby(t, key=lambda x: x[2])]