2010-07-29 49 views
1

我需要處理這樣一種格式的氣象站數據(SYNOP),其中每行代表一個測量並且我有數千個測量結果:Python:找到3個相鄰列表項並確定其中的第一個列表索引

line = 'AAXX 01004 60265 32970 03404 10048 20010 38997 48605 51014=' 

與第六塊開始,塊的編號(1XXXX 2xxxx時3XXXX等,有時只有5個塊,但有時也更具有附加數據)

的關鍵點在於之間的塊的數量AAXX和1xxxx塊並不總是相同的,但我知道2塊在1xxxx塊之前有我需要的數據。爲了可靠地查明該塊,我需要確定1xxxx塊的位置並從那裏向後計數。

我的想法是沿着空格將行分割成一個列表,然後迭代列表項以查找1xxxx塊列表中的位置。

list = line.split(' ') 

但我不知道如何做這個迭代。必須有一個合理優雅的方式來尋找3個塊,其中第一個以1開始,第二個以2以及第三以3,然後返回第一個塊的列表索引?

這可能很簡單,但我無法弄清楚,並會很感激任何提示!

編輯:爲了澄清,有可能另一個以1開頭的塊出現在我需要的塊之前,所以找到我需要的塊的唯一可靠方法是確保它跟着一個以2開頭的另一個從3開始(這應該會將誤報機率降低到幾乎0)。

+0

我認爲這將是更好,更安全的SYNOP格式解碼正確 – 2010-07-29 09:07:34

+0

Gnibbler:我同意。你知道SYNOP並有任何指針嗎?在我看來,格式沒有很好的定義,氣象站也不一定遵循規範,但是使用第一個1xxxx塊作爲參考點來解碼格式的方法似乎是一個很好的折衷方案,但需要一個強大的找到它的方法。 – stff00 2010-07-29 10:49:33

回答

1

有多種方法可以做到這一點。一種方法是搜索列表索引和減去兩個:

list[ (i for i, j in enumerate(list) if j.startswith("1")).next() - 2 ] 

另一種方法是將一個正則表達式匹配到(未分離)字符串:

import re 
re.search("\d{5}(?= \d{5} 1\d{4} 2\d{4} 3\d{4})", line) 

這五個塊匹配數字,只要它後面跟着1xxxx 2xxxx 3xxxx其中x是任何數字。

+0

謝謝 - 我應該澄清一下,有可能另一個以1開頭的塊出現在我需要的塊之前,所以找到我需要的塊的唯一可靠方法是確保它後面跟着一個以2開頭的塊和另一個塊從3開始(這應該會將誤報機率降低到幾乎0)。也許用正則表達式我可以做到這一點? – stff00 2010-07-29 08:13:27

+0

爲你修改正則表達式。 – katrielalex 2010-07-29 08:14:11

+0

正則表達式完成我想要做的事情,並且比迭代列表更容易。謝謝!您的代碼缺少右括號和空格,但應爲: re.search(「\ d {5}(?= \ d {5} 1 \ d {4} 2 \ d {4} 3 \ d {4})「,行) – stff00 2010-07-30 06:53:05

0

遍歷列表非常簡單:

l = line.split(' ') 
for element in l: 
    # element is now one of the strings from your list 
    if element[0] == "1": 
    print "This block begins by 1" 
相關問題