将数据分组到满足一定条件的指定间隔中

2024-06-16 09:06:50 发布

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

我想把这个单子里的那些项目分类。。。在

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

。。。使用最后一个字段将它们分组到3500大小的箱子中 因此,理想的结果是:

^{pr2}$

我试图使用itertools.groupby()函数,但我无法找到指定bin大小的方法。在


Tags: 项目分类sigma单子deltaitertoolsgroupby理想
3条回答

使用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()

输出:

^{pr2}$

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

输出:

^{pr2}$

具有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

退货:

^{pr2}$

当一组的最大值减去之前组的最小值小于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的解决方案在一般情况下仍然可以实现更好的分组。在

相关问题 更多 >