循环通过列表并在找到第一个字符串时停止

时间:2012-03-24 02:17:46

标签: python

我有一个列表,我想要提取top_row和bottom_row之间存在的数据到另一个列表。 我知道top_row以及bottom_row对应于data [0] =最后一个整数数据(下一行是由字符串组成的,但也有整数行,我不感兴趣)。

我尝试了几件事,但没有成功:

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的行感兴趣。

非常感谢!

4 个答案:

答案 0 :(得分: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)

答案 1 :(得分:2)

如果try部分没有引发异常,那么基本上你会得到一个无限循环,因为aux总是True

我不能完全确定你在代码中做了什么,因为数据看起来不清楚并且有些东西没用(比如n?),但总的来说,你可以停止使用for语句运行循环(whilebreak循环):

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)

答案 2 :(得分: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代码的惯例,可以将fileData重命名为file_data

答案 3 :(得分: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()