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是的,就是这样……不完全是我想要做的,但它可能给出一个很好的提示。不完全是我想要做的,但它可能给出一个很好的提示。