我有一个列表的示例,我正在迭代,并试图找到最大值,只需要数字。我忽略了空格,但需要更改'< 0.005'只有0.005,所以我可以使用它。
lst = [['<0.005'],
['<0.005'],
['2.1'],
['2.1'],
['1.7'],
['0.098'],
[''],
['1.7'],
['0.91'],
['1.2']]
这是我的代码的相关部分
for i in range(0,9):
if lst[i][0] != '':
if lst[i][0] == '<0.005'
lst[i][0] = 0.005
elif float(lst[i][0]) > maxP[i][0]:
maxP[i][0] = lst[i][0]
但if lst[i][0] == '<0.005'
似乎无法正常工作,即代码似乎只是忽略它,我得到第二个最后一行的ValueError: could not convert string to float:
错误,因为它仍在尝试访问&lt ; 0.005位。
有没有办法轻松解决这个问题?理想情况下,我希望它处理诸如&lt; 0.098之类的字符串并将其转换为0.098的浮点数
非常感谢任何帮助/建议,thx
答案 0 :(得分:2)
你的问题是一个空字符串(只有白色字符的字符串),而不是“&lt; 0.005”(你正确处理),你不能将空字符串转换为浮点数。
您只需要在第二行添加.strip()
for i in range(0,9):
if lst[i][0].strip() != '':
if lst[i][0] == '<0.005':
lst[i][0] = 0.005
elif float(lst[i][0]) > maxP[i][0]:
maxP[i][0] = lst[i][0]
答案 1 :(得分:0)
您可以使用此正则表达式删除任何不属于数字的字符:
value = re.sub(r'[^0-9.-]', '', value)
当然它仍会让...5
或5-5
之类的东西通过,但如果你只想摆脱领先/尾随废话,那么正则表达式就能完成它的工作。
lst = [[float(re.sub(r'[^0-9.-]', '', x[0]))] for x in lst if x[0].strip()]
答案 2 :(得分:0)
您可以使用正则表达式删除所有不是数字的字符。
import re
def get_num_from_str(in_str):
return re.sub("[^0-9]", "", in_str)
现在,您可以将列表中的所有项目转换为数字
答案 3 :(得分:0)
您可以使用正则表达式
import re
lst = [['<0.005'],
['<0.005'],
['2.1 '],
['2.1 '],
['1.7 '],
['0.098 '],
[' '],
['1.7 '],
['0.91 '],
['1.2 ']]
def findMax(ilist):
result = 0.0
floatPattern = re.compile('\d+.\d+')
for el in ilist:
myFloat = floatPattern.search(el[0])
if myFloat != None:
if result < float(myFloat.group()):
result = float(myFloat.group())
return result
print findMax(lst)