2012-03-24 25 views
1

我有一個列表,我想提取另一個列表中存在top_row和bottom_row之間的數據。 我知道top_row,並且bottom_row對應於data [0] =最後一個整數數據(下一行是由字符串組成的,但也有我不感興趣的整數行)。通過列表循環,並在找到第一個字符串時停止

我已經試過幾件事情,但W/O型成功:

for row,data in enumerate(fileData): 
    if row > row_elements: #top_row 
     try: 
      n = int(data[0]) 
      aux = True 
     except: 
      n = 0 
     while aux: #until it finds the bottom_row 
      elements.append(data) 

的問題是,它從來沒有迭代的第二行,如果我更換,同時用,如果我得到的所有行,第一列是一個整數。

FILEDATA是這樣的:

*Element, type=B31H 
    1, 1, 2 
    2, 2, 3 
    . 
    . 
    . 
359, 374, 375 
360, 375, 376 
*Elset, elset=PART-1-1_LEDGER-1-LIN-1-2-RAD-2__PICKEDSET2, generate 

我行與第一列的值等於1到360

感謝只關心!

+1

嘗試改變'而aux'爲'如果aux',如果我正確地理解你的代碼,這應該工作。 – satoru 2012-03-24 02:22:47

+0

這有效,但該文件有多個字符串和整數值,我只對包含在特定區域中的整數值感興趣...... – jpcgandre 2012-03-24 02:25:28

+1

「數據」的結構是什麼樣的? – satoru 2012-03-24 02:26:46

回答

2

如果沒有異常的try部分拋出,那麼你基本上結束了一個無限循環,因爲aux永遠是True

由於數據看起來不清楚,有些東西沒有被使用(如n?),所以我不完全確定你在代碼中做了什麼,但是通常你可以停止運行循環(包括forwhile環路)與break聲明:

for row, data in enumerate(fileData): 
    if conditionToAbortTheLoop: 
     break 
你的情況

所以,我猜想像這樣的工作:

for row, data in enumerate(fileData): 
    if row > row_elements: # below `top_row` 
     try: 
      int(data[0]) 
     except ValueError: 
      break # not an int value, `bottom_row` found 

     # if we get here, we’re between the top- and bottom row. 
     elements.append(data) 
+0

接受你的答案,因爲它是最好的! – jpcgandre 2012-03-24 02:36:04

4

您發佈的代碼令人困惑。例如,「aux」是一個不好名稱的變量。循環真的希望從輸入的一個特定元素開始,但它循環遍歷所有內容,直到找到它想要的迭代爲止,將可能是恆定時間的操作轉變爲線性操作。讓我們嘗試重寫它:

for record in fileData[row_elements:]: # skip first row_elements (might need +1?) 
    try: 
     int(record[0]) 
    except ValueError: 
     break # found bottow_row, stop iterating 
    elements.append(record) 
+2

循環開始+1;如果它失敗,int()會拋出一個'ValueError',而不是'TypeError'。 – poke 2012-03-24 02:32:02

+0

它給出了以下錯誤:ValueError:無效文字爲int()與基10:'* Elset',它似乎不會停在最後一個整數行... – jpcgandre 2012-03-24 02:32:26

+0

使用ValueError進行驗證,它就像一個魅力!謝謝!!!!!!! – jpcgandre 2012-03-24 02:33:53

1

將這項工作?

for row, data in enumerate(fileData): 
    if row > row_elements: #top_row 
     try: 
      n = int(data[0]) 
      elements.append(data) 
     except ValueError: 
      continue 

或者怎麼樣:

elements = [int(data[0]) for data in fileData if data[0].isdigit()] 

順便說一句,如果你願意遵循的最python代碼的約定,你可以重命名fileDatafile_data

0

使用發電機:

def isInteger(testInput): 
    try: 
     int(testInput) 
     return True 
    except ValueError: return False 

def integersOnly(fileData): 
    element = fileData.next() 
    while isInteger(element): 
     yield element 
     element = fileData.next() 
相關問題