我有一个字符串列表如下
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
答案 0 :(得分:2)
基于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)]
在你对函数进行矢量化以使其接受整个矢量作为输入时,然后只需使用应用于列表的函数作为索引来获取所需的元素。
将整个数组转换为浮点数和占位符值,然后过滤掉占位符。
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)的值用作生成新数组的索引。
如果你并不关注速度(如果你的阵列不长)并想要一个快速而肮脏的解决方案,你可以坚持使用追加的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)]