我有一个列表,我想要提取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的行感兴趣。
非常感谢!
答案 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
语句运行循环(while
和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)
答案 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()