Python错误处理程序:从字符串列表创建浮点子列表

2024-04-23 22:08:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个字符串列表如下

list1 = [' ', '(', '13', 'temp', '1.0E-02', 'given', '42.35', '=', '5']

如何获得前n个浮点值?例如,下面的代码获取float的最后一个值。如何修改它以获得前n个值

list1 = [' ', '(', '13', 'temp', '1.0E-02', 'given', '42.35', '=', '5']
for val in list1:
   try:
      float1 = float(val)
   except ValueError:
      continue

Tags: 字符串代码in列表forvalfloattemp
3条回答

更新到n=4,因为人们似乎被输出所抛弃。你知道吗

下面是一种仅打印前n个浮点元素的map/filter方法:

n = 4 # Put the number of elements you'd like to see here, for more use 4, 5, etc.
list1 = [' ', '(', '13', 'temp', '1.0E-02', 'given', '42.35', '=', '5']

def get_float(x):
    try:
        return float(x)
    except ValueError:
        pass

for x in list(filter(lambda _: _ is not None, map(get_float, list1)))[:n]:
    print(x)

印刷品:

13.0
0.01
42.35
5.0

编辑

按照评论中的要求详细阐述一下:

^{}接受一个函数和一个iterable,并将该函数应用于iterable中的每个元素,在本例中,我们试图将get_float映射到每个元素x。你知道吗

现在,如果x是一个float,get_float成功,并将x转换为一个float值。如果x不能被转换成float,函数将抛出一个ValueError,我们实际上不需要对它做任何事情-所以我们传递,因为没有return语句,我们最终返回None。你知道吗

然而,在我们的map的初始传递之后,我们作为所有ValueError的结果得到的None最终会出现在映射的输出中,因此如果您打印list(map(get_float, list1)),将会看到这样的内容:[None, None, 13.0, None, 0.01, None, 42.35, None, 5.0],以及所有那些额外的None

^{}接受一个函数,如果您想保留一个元素,则返回True;如果您想去掉它,则返回False,然后返回一个iterable,结果是另一个iterable只包含您想保留的元素。filter(None, iterable)只使用默认筛选器,其中bool(x)计算结果为False的所有内容都将被丢弃。因此,在应用过滤器之后,我们只会得到filteriterable中的float,我们将其转换为list,并对结果([:n])进行切片,以仅保留前n个元素。你知道吗

方案1

建立在Tgsmith61591的解决方案之上:只需获取一个布尔数组作为列表的索引。你知道吗

import numpy as np

def floatable(x):
  try:
    float(x)
    return True
  except:
    return False

floatable_vec = np.vectorize(floatable) 
list1 = np.array([' ', '(', '13', 'temp', '1.0E-02', 'given', '42.35', '=', '5', '0'])
floats = list1[floatable_vec(list1)]

将函数矢量化,使其接受整个向量作为输入,然后只需使用应用于列表的函数作为索引即可获得所需的元素。你知道吗

方案2

将整个数组转换为浮点数和占位符值,然后过滤掉占位符。你知道吗

import numpy as np

def floatify(val):
  try:
    return float(val)
  except ValueError:
    return np.nan

list1 = [' ', '(', '13', 'temp', '1.0E-02', 'given', '42.35', '=', '5', '0']
floats_raw = np.array(map(floatify, list1))
floats = floats_raw[~np.isnan(floats_raw)]

map将函数floatify应用于list1中的每个元素。它为无法转换的值生成一个浮点数组和np.nannp.isnan()函数给出了一个布尔数组,对于np.nan值是真的。然后将此布尔数组的逆数组(因此只有非nan的值)用作生成新数组的索引。你知道吗

方案3

如果你不关心速度(如果你的数组不是那么长)并且想要一个快速而肮脏的解决方案,你可以坚持使用一个for循环来附加:

list1 = [' ', '(', '13', 'temp', '1.0E-02', 'given', '42.35', '=', '5', '0']
floats=[]
for val in list1:
   try:
      floats.append(float(val))
   except ValueError:
      continue

输出

注意,我稍微更改了输入并添加了一个0值,这个值很难过滤。

以上所有方法都提供以下输出:

In: print(floats)
Out: [  1.30000000e+01   1.00000000e-02   4.23500000e+01   5.00000000e+00   0.00000000e+00]

只需获取floats数组的第一个n值即可获得第一个n值:

n = 2
floats_fewer = floats[:n]

它给出:

In: print(floats_fewer)
Out: [  1.30000000e+01   1.00000000e-02]

这是一种混乱。。。但是,如果你想理解的话:

def floatable(x):
    try:
        float(x)
        return True
    except:
        return False

floats = [float(x) for x in list1 if floatable(x)]
>>> floats
[13.0, 0.01, 42.35, 5.0]

然后要得到第一个n。。。你知道吗

floats[:n]

相关问题 更多 >