Python 删除所有出现的点,列表元素中第一个出现的点除外
我有一个列表需要转换为浮动。由于数据不是由我输入的,因此有些元素具有意外的额外周期,例如Python 删除所有出现的点,列表元素中第一个出现的点除外,python,string,list,Python,String,List,我有一个列表需要转换为浮动。由于数据不是由我输入的,因此有些元素具有意外的额外周期,例如39.04.1450。我需要能够自动删除除第一个出现的句点之外的所有句点,以便在我说list=float(list)时不会出错 样本列表: latitude= [' -86.57', ' 39.04.1450', ' 37.819' ,' 45.82', ' 54.42', ' 0.' ,' 53.330444', ' +45.75' ,' 52.36', ' 43.2167', ' -36.75', '
39.04.1450
。我需要能够自动删除除第一个出现的句点之外的所有句点,以便在我说list=float(list)
时不会出错
样本列表:
latitude= [' -86.57', ' 39.04.1450', ' 37.819' ,' 45.82', ' 54.42', ' 0.' ,' 53.330444',
' +45.75' ,' 52.36', ' 43.2167', ' -36.75', ' 6.8N' ,' 40.833' ,' -97.981',
' 41.720', ' 41.720', ' 37.41' ,' 37.41' ,' 37.41', ' 37.41']
如您所见,纬度[1]
有一个额外的小数点。当然,我还需要去掉6.8N
中的N,但这是一个单独的问题
def my_float(s):
s=s.split(".")
return float(".".join([s[0],"".join(s[1:]))])
我们将继续讨论。并重新加入只添加第一个句点。。。但是,如果损坏的数据末尾仅包含
N
,并且包含多个
,则它不会对-6.8N进行任何小的攻击。。。除此之外,你还需要添加更多的条款
latitude = [' -86.57', ' 39.04.1450', ' 37.819', ' 45.82', ' 54.42', ' 0.', ' 53.330444', ' +45.75', ' 52.36', ' 43.2167', ' -36.75', ' 6.8N', ' 40.833', ' -97.981', ' 41.720', ' 41.720', ' 37.41', ' 37.41', ' 37.41', ' 37.41']
flist = []
for i in latitude:
try:
flist.append(float(i))
except ValueError:
if (i[-1] == 'N'):
flist.append(float(i[:-1]))
else:
flist.append(float("{}.{}".format(i.split(".")[0],''.join(i.split(".")[1:]))))
print (flist)
输出
[-86.57, 39.04145, 37.819, 45.82, 54.42, 0.0, 53.330444, 45.75, 52.36, 43.2167, -36.75, 6.8, 40.833, -97.981, 41.72, 41.72, 37.41, 37.41, 37.41, 37.41]
我会这样做:
def fix_float(s):
return s.replace('.', '[DOT]', 1).replace('.', '').replace('[DOT]', '.')
该函数将第一次出现的'.
替换为'[DOT]'
。然后,它将删除所有出现的。
。最后,它将'[DOT]'
替换回'.
要将其应用于列表中的所有元素,请编写:
fixed_latitudes = [fix_float(s) for s in latitude]
这个怎么样
def lol_float(_str):
# check where decimal point is (starting from right) '3.45' -> 2
dpi = (len(_str) - _str.count('.') - _str.index('.')) if '.' in _str else 0
# '3.45' -> 345.0
float_as_int = float(filter(lambda x: x.isdigit(), _str))
# dpi = 2, float_as_int = 34.0 -> 3.45
return float_as_int / (10 ** dpi)
输出:
>>> lol_float('3.34')
3.34
>>> lol_float('3.45')
3.45
>>> lol_float('345')
345.0
>>> lol_float('34.5')
34.5
>>> lol_float('3.4.5')
3.45
>>> lol_float('3.45')
3.45
>>> lol_float('345')
345.0
>>> lol_float('3.4..5')
3.45
>>> lol_float('3.4..5.4')
3.454
只是原创而已……:) 您可以使用:
\d
表示任何数字,+
表示一个或多个,\.
与点字符匹配。括号表示捕获该部分匹配,随后在sub()
中用作\1
(表示第一个捕获组) 您可以使用str.rstrip
删除任何字母:
from string import ascii_letters
out = []
for x in latitude:
x = x.rstrip(ascii_letters)
spl = x.split(".")
if len(spl) > 2:
out.append(float("{}.{}".format(spl[0],"".join(spl[1:]))))
else:
out.append(float(x)))
print(out)
[-86.57, 39041450.0, 37.819, 45.82, 54.42, 0.0, 53.330444, 45.75, 52.36, 43.2167, -36.75, 6.8, 40.833, -97.981, 41.72, 41.72, 37.41, 37.41, 37.41, 37.41]
您可以在单个列表comp中完成,但效率较低:
print([float(x[::-1].rstrip(ascii_letters).replace(".","")[::-1]) if x.count(".") > 1 else float(x.rstrip(ascii_letters)) for x in latitude ])
您可以使用正则表达式从列表中提取数字,并立即将其转换为浮点数
import re
lat = lambda l: float(re.search('[+-]*\d*\.\d*',l).group(0))
print map(lat,latitude)
编辑:
对不起,我没有注意到,第二个小数点后的数字也是有效的。
一个新的解决方案仍然希望第一个点是好的,其余的都被删除
其中一个值包含N,所以我想可能还有S,这意味着它是南部的,也就是负纬度。因此,我在代码中实现了这个假设
def有效时间:
a=re.findall('\s*[+-]*\d*\.\d*',s)[0]
b=s.lstrip(a)
d=b.替换('.','')
c=re.sub(“[nNsS]$”,“,”,d)
符号=1。
如果重新匹配(“[sS]$”,d):符号=-1。
返回(浮动(a+c))*符号
然后只需map
it:
地图(有效纬度)
前面的空格呢?关于'6.8N'
@JoranBeasley,他们不会忽略N的
)@Solr,不管你做什么,float(list)
都不起作用,这种自动纠错似乎有问题。当用户输入“1.2.3”时,您如何知道他们的意思是“1.23”还是“12.3”?我认识到“39.04.1450”不可能是3904.1450,因为纬度没有那么高,但可能存在其他不明确的输入。如果有一个额外的周期,但不是多个周期,这是可行的'39.04.1450.77.77'
变成'39.041450.7777'
@tdelaney现在它最多可以删除两个额外的点。我怀疑他还需要更多,因为他没有提到,而且纬度有度、分和秒(中间最多2点)。最新版本仍然无法处理'39.04.1450'
。我认为这个问题很难解决,因为只有一次常规异常,我支持@JoranBeasley的解决方案。但是你提出了一个很好的观点——简单地删除度.分.秒格式中的点并不能给出你想要的数字。假设是UTM@tdelaney True,仅处理1个额外点。但考虑到它的纬度,我不会尝试包括其他点,毕竟。关于他从分秒到度的转换可能存在的问题,你是对的。有趣的解决方案。。。从性能的角度来看可能不是很好,但它肯定会起作用
import re
lat = lambda l: float(re.search('[+-]*\d*\.\d*',l).group(0))
print map(lat,latitude)