Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 删除所有出现的点,列表元素中第一个出现的点除外_Python_String_List - Fatal编程技术网

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)