2012-10-28 178 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]] 
]