Python 将数据分组为满足特定条件的指定间隔

Python 将数据分组为满足特定条件的指定间隔,python,group-by,itertools,Python,Group By,Itertools,我想把这个列表中的那些项目分类到新的列表中 truc = [['12', 'brett', 5548], ['22.3', 'troy', 9514], ['8.1', 'hings', 12635], ['34.2', 'dab', 17666], ['4q3', 'sigma', 18065], ['4q3', 'delta', 18068]] 。。。使用最后一个字段将它们分组到大小为3500的箱子中 因此,理想的结果是

我想把这个列表中的那些项目分类到新的列表中

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()
函数,但我无法找到指定存储箱大小的方法。

如果没有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]]]

如果没有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]]]

带有
groupby
的基本binner:

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的解决方案在平均情况下仍能实现更好的分组。

groupby
的基本binner:

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的解决方案在平均情况下仍能实现更好的分组。

使用
defaultdict()

使用
defaultdict()


是的,你说得对。我想说的是,垃圾箱的大小是3500个。我会编辑。谢谢如果最后一个字段值为0、3000和6000,那么配对将是什么<代码>[03000]、[6000]或
[0]、[30006000]
[030006000]
?指定一个返回键除以3500的整数结果的函数是否足够?不过,这可能会以一种不太理想的方式对项目进行分组。@jwpat7:您不认为他只是错误地键入了180688而不是18068,如果您查看其他值,这是合乎逻辑的吗?@BrtH是的,就是这样……是的,您是对的。我想说的是,垃圾箱的大小是3500个。我会编辑。谢谢如果最后一个字段值为0、3000和6000,那么配对将是什么<代码>[03000]、[6000]或
[0]、[30006000]
[030006000]
?指定一个返回键除以3500的整数结果的函数是否足够?不过,这可能会以一种不太理想的方式对项目进行分组。@jwpat7:你不认为他只是错误地键入了180688而不是18068,如果你查看其他值,这是合乎逻辑的吗?@BrtH是的,就是这样……不完全是我想要做的,但它可能给出一个很好的提示。不完全是我想要做的,但它可能给出一个很好的提示。