2012-03-24 29 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() 
相关问题