Python 根据仓位大小将列表划分为多个列表

Python 根据仓位大小将列表划分为多个列表,python,Python,我有一个包含100000多个值的列表 我需要根据特定的箱子宽度(比如0.1)将列表划分为多个较小的列表。有谁能帮我写一个python程序来实现这一点吗 我的清单是这样的 -0.234 -0.04325 -0.43134 -0.315 -0.6322 -0.245 -0.5325 -0.6341 -0.5214 -0.531 -0.124 -0.0252 list1 = [-0.04325, -0.0252] list2 = [-0.124] list3 = [-0.234, -0.245

我有一个包含100000多个值的列表

我需要根据特定的箱子宽度(比如0.1)将列表划分为多个较小的列表。有谁能帮我写一个python程序来实现这一点吗

我的清单是这样的

-0.234
-0.04325
-0.43134
-0.315
-0.6322
-0.245
-0.5325
-0.6341
-0.5214
-0.531
-0.124
-0.0252
list1 = [-0.04325, -0.0252] 
list2 = [-0.124] 
list3 = [-0.234, -0.245 ] 
list4 = [-0.315] 
list5 = [-0.43134] 
list6 = [-0.5325, -0.5214, -0.531] 
list7 = [-0.6322, -0.6341]
我想有一个这样的输出

-0.234
-0.04325
-0.43134
-0.315
-0.6322
-0.245
-0.5325
-0.6341
-0.5214
-0.531
-0.124
-0.0252
list1 = [-0.04325, -0.0252] 
list2 = [-0.124] 
list3 = [-0.234, -0.245 ] 
list4 = [-0.315] 
list5 = [-0.43134] 
list6 = [-0.5325, -0.5214, -0.531] 
list7 = [-0.6322, -0.6341]

这将创建一个dict,其中每个值都是一个容器中适合的元素列表

import collections
bins = collections.defaultdict(list)
binId = lambda x: int(x*10)
for val in vals:
    bins[binId(val)].append(val)
这是你想要的吗?(示例输出可能会有所帮助:)

收益率:

 [2 3 0 1 0 1 2 0 1 2]
这个问题可能会有帮助。

这个方法有效:

l=[-0.234, -0.04325, -0.43134, -0.315, -0.6322, -0.245,
-0.5325, -0.6341, -0.5214, -0.531, -0.124, -0.0252]

d={}
for k,v in zip([int(i*10) for i in l],l):
   d.setdefault(k,[]).append(v)

LoL=[d[e] for e in sorted(d.keys(), reverse=True)]

for i,l in enumerate(LoL,1):
    print('list',i,l)    
印刷品:

list 1 [-0.04325, -0.0252]
list 2 [-0.124]
list 3 [-0.234, -0.245]
list 4 [-0.315]
list 5 [-0.43134]
list 6 [-0.5325, -0.5214, -0.531]
list 7 [-0.6322, -0.6341]
工作原理:

1: The list
>>> l=[-0.234, -0.04325, -0.43134, -0.315, -0.6322, -0.245,
... -0.5325, -0.6341, -0.5214, -0.531, -0.124, -0.0252]

2: Produce the keys:
>>> [int(i*10) for i in l]
[-2, 0, -4, -3, -6, -2, -5, -6, -5, -5, -1, 0]

3: Produce tuples to put in the dict:
>>> zip([int(i*10) for i in l],l)
[(-2, -0.234), (0, -0.04325), (-4, -0.43134), (-3, -0.315), (-6, -0.6322), 
 (-2, -0.245), (-5, -0.5325), (-6, -0.6341), (-5, -0.5214), (-5, -0.531), 
 (-1, -0.124), (0, -0.0252)]

4: unpack the tuples into k,v and loop over the list
>>>for k,v in zip([int(i*10) for i in l],l):

5: add k key to a dict (if not there) and append the float value to a list associated 
   with that key:
    d.setdefault(k,[]).append(v)

我建议就这些语句编写Python教程

下面是一个简单而好的方法:

Digitalize,返回一个数组,其中包含每个元素所属的存储箱的索引值。

我们可以使用第三方库制作存储箱

给定的

iterable = (
    "-0.234 -0.04325 -0.43134 -0.315 -0.6322 -0.245 "
    "-0.5325 -0.6341 -0.5214 -0.531 -0.124 -0.0252"
).split()

iterable
# ['-0.234', '-0.04325', '-0.43134', '-0.315', '-0.6322', '-0.245', '-0.5325', '-0.6341', '-0.5214', '-0.531', '-0.124', '-0.0252']
代码

import more_itertools as mit


keyfunc = lambda x: float("{:.1f}".format(float(x)))
bins = mit.bucket(iterable, key=keyfunc)

keys = [-0.0,-0.1,-0.2, -0.3,-0.4,-0.5,-0.6]
a,b,c,d,e,f,g = [list(bins[k]) for k in keys]
c
# ['-0.234', '-0.245']

详细信息

我们可以通过键函数进行装箱,我们定义该函数将数字格式化为单个精度,即
-0.213
-0.2

keyfunc = lambda x: float("{:.1f}".format(float(x)))
bins = mit.bucket(iterable, key=keyfunc)
通过按键功能定义的按键访问这些箱子:

c = list(bins[-0.2])
c
# ['-0.234', '-0.245']
通过迭代键访问所有箱子:

f = lambda x: float("{:.1f}".format(float(x)))
bins = mit.bucket(iterable, key=keyfunc)

keys = [-0.0,-0.1,-0.2, -0.3,-0.4,-0.5,-0.6]
for k in keys:
    print("{} --> {}".format(k, list(bins[k])))
输出

-0.0 --> ['-0.04325', '-0.0252']
-0.1 --> ['-0.124']
-0.2 --> ['-0.234', '-0.245']
-0.3 --> ['-0.315']
-0.4 --> ['-0.43134']
-0.5 --> ['-0.5325', '-0.5214', '-0.531']
-0.6 --> ['-0.6322', '-0.6341']
列表理解和解包是另一个选项(参见代码示例)

有关更多详细信息,请参见。

可以通过以下方式进行装箱:

注意:这个简单的键函数假定iterable中的值介于-0.0和-10.0之间。考虑<代码> lambda x:“{:1f}”。一般情况下格式(浮点(x))< /> >


有关
groupby
工作原理的详细信息,请参见此部分。

您提供了示例输入;还请提供预期输出。直方图给出了箱子中的元素数量,但没有给出元素本身。我试过了。我的原始问题中包含了一个示例输出。@user1492449谢谢您的反馈,我会仔细考虑一下,也许会发布另一个答案。同时,编辑您的帖子,使输出更具可读性。感谢您的回复,它可以正常工作。你能给我解释一下吗?你能告诉我第3行发生了什么吗。@用户它正在创建一个lambda。这是一个临时函数,用于将值映射到bin ID。如果您想要更深入的信息,我建议您搜索“python lambda”。
import itertools as it


iterable = ['-0.234', '-0.04325', '-0.43134', '-0.315', '-0.6322', '-0.245',
            '-0.5325', '-0.6341', '-0.5214', '-0.531', '-0.124', '-0.0252']

a,b,c,d,e,f,g = [list(g) for k, g in it.groupby(sorted(iterable), key=lambda x: x[:4])]
c
# ['-0.234', '-0.245']