2014-02-24 27 views
0

我在使用python組織數據時遇到問題。基本上我有數據的csv文件,格式如下:迭代數據並分裂成不同的類別

Direction(Deg), Speed(m/s) 
10, 2.8 
20, 3.2 
45, 5.2 
.., .. 
.., .. 
360, 20 

所以用這個有問題的IM是,我試圖分類的數據轉換成單獨的列表,所以例如方向和速度的列表在45和67.5之間,在2-3米/秒的範圍內。以22.5度的增量有16個不同的方向範圍,以1米/秒的增量有30個不同的速度範圍。

我想我可以把我的主要問題解決爲兩個問題: 1.我怎樣才能生成所需的列表而無需手動編寫什麼將超過百個列表,是否可以自動執行此操作? 2.我怎麼能遍歷數據提取我需要到相應的列表中的數字,到目前爲止,我一直在試圖for循環中的for循環做了,如下圖所示:

a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 19, 20] 

for number in xrange(0,20,2): 
    for value in a: 
     if value >= number -2 and value < number: 
      print value 

不過我想不到從我的問題的第一部分解決創建列表問題的方法。

對不起,這可怕的措辭..我仍然是非常新的使用Python,因爲你可能能夠告訴我還沒有讓我的頭來解決這個問題!任何信息指向正確的方向將是有益的!

+0

只是檢查一下:你明白我的解決方案嗎?我可以澄清一切嗎?如果這是解決您問題的最佳解決方案,請將其作爲解決方案打勾 - 這會獎勵我協助您。如果您找到了更好的解決方案,您也可以在下面輸入答案。 –

+0

嗨,是的,這個解決方案絕對有用謝謝你。不過,我最終使用numpy和數字化函數索引一切,並將其轉換爲我需要的表單。 Defaultdict實際上實現了與數組中的數據一起工作更容易的相同事情。 – user3348554

回答

0
from collections import defaultdict 
import csv 

INPUT = "myfile.csv" 
ANGLE_SZ = 22.5 
SPEED_SZ = 1. 

def read_csv(fname, skip_header=False, **kwargs): 
    with open(fname, "rb") as inf: 
     incsv = csv.reader(inf, **kwargs) 
     if skip_header: 
      header = next(incsv, None) 
     for row in incsv: 
      yield row 

def main(): 
    data = defaultdict(lambda: defaultdict(list)) 
    for d,s in read_csv(INPUT, skip_header=True): 
     data[int(d/ANGLE_SZ)][int(s/SPEED_SZ)].append((d,s)) 

    # data[][] now contains all your data, sorted into buckets 

if __name__=="__main__": 
    main()