Python错误处理程序:从字符串列表

时间:2016-03-23 15:31:45

标签: python string exception type-conversion

我有一个字符串列表如下

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

5 个答案:

答案 0 :(得分:2)

选项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.nan,用于无法转换的值。 np.isnan()函数给出了一组对np.nan值为真的布尔值。然后将此布尔数组的反函数(因此只有非n&t; t)的值用作生成新数组的索引。

选项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]

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

n = 2
floats_fewer = floats[:n]

给出:

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

答案 1 :(得分:2)

更新到n=4,因为人们似乎被输出所甩掉了。

这是一种使用map / filter的方法,它只打印前n个float元素:

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

修改

根据评论中的要求详细说明:

map接受一个函数和一个iterable,并将该函数应用于iterable中的每个元素,在我们的示例中,我们尝试将get_float映射到每个元素x

现在,如果x是浮点数,get_float成功并将x cast返回到浮点值。如果x不能转换为float,函数将抛出ValueError,我们实际上不需要做任何事情 - 所以我们传递,因为没有return语句,我们最终返回{{ 1}}。

但是,在我们None初次通过后,我们得到的所有map的{​​{1}} s都会在地图的输出中结束,所以如果你打印{ {1}}会看到类似None的内容,以及所有额外的ValueError

filter接受一个函数,如果你想保留一个元素,则返回list(map(get_float, list1)),如果你想要删除它,则[None, None, 13.0, None, 0.01, None, 42.35, None, 5.0]和一个可迭代的函数,并导致另一个只能使用您想要保留的元素进行迭代。 None只使用默认过滤器,其中True评估为False的所有内容都将被丢弃。因此,在应用过滤器之后,我们最终得到了filter(None, iterable) iterable中的浮点数,我们将其转换为bool(x),并将其结果(False)切片为仅保留前n个元素。

答案 2 :(得分:1)

这是一种kludgey ......但是,如果你想在理解中做到这一点:

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]

答案 3 :(得分:1)

我认为这种方式与你的非常相似。我刚刚添加了条件 len(浮动)< max_floats

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

i=0
while i < len(list1) and len(floats) < max_floats:
   try:
      floats.append(float(list1[i]))
   except ValueError:
      continue
   finally:
      i+=1

print (floats)

因此,此代码生成以下输出:

[13.0, 0.01, 42.35]

答案 4 :(得分:0)

这是另一个正则表达式

import re

list1 = [' ', '(', '13', 'temp', '1.0E-02', 'given', '42.35', '=', '5']
print [x for x in list1 if re.match("^\d+?\.\d+?", x)]