2012-10-28 124 views
0

指定的时间间隔,我想整理成新的列表在此列表中的项目...组数据为满足一定条件

truc = [['12', 'brett', 5548], 
     ['22.3', 'troy', 9514], 
     ['8.1', 'hings', 12635], 
     ['34.2', 'dab', 17666], 
     ['4q3', 'sigma', 18065], 
     ['4q3', 'delta', 18068]] 

...使用最后一个字段将它们分组,划分成大小为3500箱 因此,理想的结果是这样的:

firstSort = [['34.2', 'dab', 17666], 
      ['4q3', 'sigma', 18065], 
      ['4q3', 'delta', 18068]] 

secondSort = [['22.3', 'troy', 9514], 
      ['8.1', 'hings', 12635]] 

lastSort = ['12', 'brett', 5548] 

我试图用itertools.groupby()功能,但我不能够找到一种方法来指定窗口尺寸的。

+0

是的,你是对的。我想表示箱子的大小是3500.我会编辑。谢谢! – peixe

+2

如果最后的字段值是0,3000和6000,那么配对是什么? '[0,3000],[6000]'还是'[0],[3000,6000]'或者[0,3000,6000]? –

+1

是否足以指定一个函数,该函数返回3500除以分号的整数结果?不过,这可能会以不太理想的方式对项目进行分组。 – LSerni

回答

3

这是微不足道的,而不做itertools

truc = [['12', 'brett', 5548], 
     ['22.3', 'troy', 9514], 
     ['8.1', 'hings', 12635], 
     ['34.2', 'dab', 17666], 
     ['4q3', 'sigma', 18065], 
     ['4q3', 'delta', 18068]] 

truc.sort(key=lambda a:a[-1]) 
groups = [[]] 
last_row = None 
for row in truc: 
    if last_row is not None and row[-1] - last_row[-1] > 3500: 
     groups.append([]) 
    last_row = row 
    groups[-1].append(row) 

import pprint 
pprint.pprint(groups) 

输出:

[[['12', 'brett', 5548]], 
[['22.3', 'troy', 9514], ['8.1', 'hings', 12635]], 
[['34.2', 'dab', 17666], ['4q3', 'sigma', 18065], ['4q3', 'delta', 18068]]] 
+0

不完全是我想要做的,但它可能会给出一个漂亮的提示。 – peixe

1

基本装器与groupby

from itertools import groupby 
from math import floor 

# data must be sorted 

data = [ ['12', 'brett', 5548], 
     ['22.3', 'troy', 9514], 
     ['8.1', 'hings', 12635], 
     ['34.2', 'dab', 17666], 
     ['4q3', 'sigma', 18065], 
     ['4q3', 'delta', 18068] ] 

groups = [] 
for k, g in groupby(data, lambda x: floor(x[-1]/3500)): 
    groups.append(list(g)) 

print groups 

返回:

[ 
    [ 
     ['12', 'brett', 5548] 
    ], 
    [ 
     ['22.3', 'troy', 9514] 
    ], 
    [ 
     ['8.1', 'hings', 12635] 
    ], 
    [ 
     ['34.2', 'dab', 17666], 
     ['4q3', 'sigma', 18065], 
     ['4q3', 'delta', 18068] 
    ] 
] 

然后可以聚结组时的最大一组的组少的最低之前原来是小于3500,然后你会得到,

[ 
    [ 
     ['12', 'brett', 5548] 
    ], 
    [ 
     ['22.3', 'troy', 9514], 
     ['8.1', 'hings', 12635] 
    ], 
    [ 
     ['34.2', 'dab', 17666], 
     ['4q3', 'sigma', 18065], 
     ['4q3', 'delta', 18068] 
    ] 
] 

即使是groupby合并后,我认为Anurag Uniyal的解决方案在普通情况下仍然可以实现更好的分组。

0

使用defaultdict()

lis=[['12', 'brett', 5548], 
     ['22.3', 'troy', 9514], 
     ['8.1', 'hings', 12635], 
     ['34.2', 'dab', 17666], 
     ['4q3', 'sigma', 18065], 
     ['4q3', 'delta', 18068]] 

from collections import defaultdict 
d=defaultdict(list) 
for i,x in enumerate(lis): 
    not_append=True 
    for y in d: 
     for z in d[y]: 
      if abs(z[-1]-x[-1])<=3500: 
       d[y].append(x) 
       not_append=False 
       break 
    else: 
     if not_append: 
      d[i].append(x) 
print d.values() 

输出:

[[['12', 'brett', 5548]], 
[['22.3', 'troy', 9514], ['8.1', 'hings', 12635]], 
[['34.2', 'dab', 17666], ['4q3', 'sigma', 18065], ['4q3', 'delta', 18068]] 
]