2012-06-30 39 views
6

Tôi có danh sách chứa hơn 100.000 giá trị trong đó.Chia danh sách thành nhiều danh sách dựa trên kích thước thùng

Tôi cần chia danh sách thành nhiều danh sách nhỏ hơn dựa trên chiều rộng thùng cụ thể nói 0,1. Bất cứ ai có thể giúp tôi làm thế nào để viết một chương trình python để làm điều này?

danh sách của tôi trông như thế này

-0.234 
-0.04325 
-0.43134 
-0.315 
-0.6322 
-0.245 
-0.5325 
-0.6341 
-0.5214 
-0.531 
-0.124 
-0.0252 

Tôi muốn có một sản lượng như thế này

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] 
+3

Bạn đã cung cấp đầu vào mẫu; xin vui lòng cũng cung cấp sản lượng dự kiến. – cheeken

Trả lời

5

này sẽ tạo ra một dict nơi mỗi giá trị là danh sách các yếu tố phù hợp trong một thùng .

import collections 
bins = collections.defaultdict(list) 
binId = lambda x: int(x*10) 
for val in vals: 
    bins[binId(val)].append(val) 
+0

bạn có thể cho tôi biết những gì đang xảy ra trong dòng 3. – user1492449

+0

@user nó đang tạo ra một lambda. Đây là một hàm tạm thời để ánh xạ các giá trị vào các id bin. Tôi muốn đề nghị tìm kiếm 'python lambda' nếu bạn muốn có thêm thông tin chi tiết. – Antimony

2

Đây có phải là những gì bạn muốn không? (Mẫu đầu ra sẽ là hữu ích :)

f = [-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 numpy as np 
data = np.array(f) 
hist, edges = np.histogram(data, bins=10) 
print hist 

sản lượng:

[2 3 0 1 0 1 2 0 1 2] 

này SO câu hỏi assigning points to bins có thể hữu ích.

+1

biểu đồ cung cấp số phần tử trong một thùng chứ không phải chính các phần tử đó. Tôi đã thử với nó. Tôi đã bao gồm một đầu ra mẫu trong câu hỏi ban đầu của mình. – user1492449

+0

@ user1492449 Cảm ơn bạn đã phản hồi, tôi sẽ bỏ qua câu trả lời này và có thể đăng câu trả lời khác. Trong khi đó, bạn đã chỉnh sửa bài đăng của mình để làm cho đầu ra dễ đọc hơn. – Levon

3

này hoạt động:

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)  

Prints:

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] 

Cách hoạt động:

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) 

Tôi đề nghị một hướng dẫn Python về các báo cáo.

+0

cảm ơn bạn đã trả lời và nó hoạt động. Bạn có thể giải thích cho tôi điều này không? – user1492449

6

Đây là một cách đơn giản và thoải mái sử dụng numpys digitize:

>>> import numpy as np 
>>> mylist = np.array([-0.234, -0.04325, -0.43134, -0.315, -0.6322, -0.245, 
         -0.5325, -0.6341, -0.5214, -0.531, -0.124, -0.0252]) 
>>> bins = np.arange(0,-1,-0.1) 
>>> for i in xrange(1,10): 
...  mylist[np.digitize(mylist,bins)==i] 
... 
array([-0.04325, -0.0252 ]) 
array([-0.124]) 
array([-0.234, -0.245]) 
array([-0.315]) 
array([-0.43134]) 
array([-0.5325, -0.5214, -0.531 ]) 
array([-0.6322, -0.6341]) 
array([], dtype=float64) 
array([], dtype=float64) 

số hoá, trả về một mảng với giá trị chỉ số cho bin mà mỗi phần tử rơi vào.

0

Chúng tôi có thể tạo thùng với more_itertools, thư viện của bên thứ ba.

Với

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'] 

Chi tiết

Chúng ta có thể bin bởi các chức năng quan trọng, whi chúng tôi xác định định dạng số thành một độ chính xác đơn, tức là -0.213 đến -0.2.

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

Những thùng được truy cập bởi các phím xác định bởi các chức năng chính:

c = list(bins[-0.2]) 
c 
# ['-0.234', '-0.245'] 

Truy cập tất cả thùng bằng cách lặp lại phím:

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]))) 

Output

-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'] 

Danh sách hiểu và unpa cking là một tùy chọn khác (xem ví dụ Mã).

Xem thêm more_itertools docs để biết thêm chi tiết.

0

binning có thể được thực hiện với itertools.groupby:

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'] 

Lưu ý: chức năng chính đơn giản này giả định các giá trị trong iterable là giữa -0,0 và -10,0. Hãy xem xét lambda x: "{:.1f}".format(float(x)) cho các trường hợp thông thường.

Xem thêm điều này post để biết chi tiết về cách hoạt động của groupby.

Các vấn đề liên quan