如何检查浮点字符串?

时间:2014-02-18 13:20:22

标签: python string list

我有一个包含不规则字词和{​​{1}}个数字的列表,我想从列表中删除所有这些float个数字,但首先我需要找到一种方法来检测它们。我知道float可以区分数字,但它不适用于str.isdigit()个数字。怎么做?

我的代码是这样的:

float

5 个答案:

答案 0 :(得分:9)

使用异常处理和列表理解。 Don't modify the list while iterating over it.

>>> def is_float(x):
...     try:
...         float(x)
...         return True
...     except ValueError:
...         return False

>>> lis = ['fun','3.25','4.222','cool','82.356','go','foo','255.224']
>>> [x for x in lis if not is_float(x)]
['fun', 'cool', 'go', 'foo']

要修改相同的列表对象,请使用切片分配:

>>> lis[:] = [x for x in lis if not is_float(x)]
>>> lis
['fun', 'cool', 'go', 'foo']

答案 1 :(得分:1)

简单方法:

new_list = []
for item in my_list:
    try:
        float(item)
    except ValueError:
        new_list.append(item)

使用正则表达式

import re
expr = re.compile(r'\d+(?:\.\d*)')

new_list = [item for item in my_list if not expr.match(item)]

关于使用list.pop()

的观点
  

当您使用list.pop()更改现有列表时,您缩短了列表的长度,这意味着更改列表的索引。如果您同时在列表上进行迭代,这将导致意外结果。此外,pop()索引作为参数,而不是元素。您正在迭代my_list中的元素。如上所述,最好创建一个新列表。

答案 2 :(得分:1)

一个死的简单列表理解,只略微添加到isdigit

my_list = [s for s in my_list if not all(c.isdigit() or c == "." for c in s)]

这将删除intfloat值的字符串表示形式(即任何字符串s,其中所有字符c都是数字或句号)。

答案 3 :(得分:1)

据我了解OP,该功能应该只删除浮点数。如果整数应该保留 - 考虑这个解决方案:

def is_float(x):
    try:
        return int(float(x)) < float(x)
    except ValueError:
        return False

my_list = ['fun', '3.25', 'cool', '82.356', 'go', 'foo', '255.224']
list_int = ['fun', '3.25', 'cool', '82.356', 'go', 'foo', '255.224', '42']

print [item for item in my_list if not is_float(item)]
print [item for item in list_int if not is_float(item)]

<强>输出

['fun', 'cool', 'go', 'foo']
['fun', 'cool', 'go', 'foo', '42']

答案 4 :(得分:0)

正则表达式可以解决这个问题 - 这段代码在每个字符串中搜索float的格式(包括以小数点开头或以小数点结尾的浮点数),如果字符串不是float,则将其添加到新列表中。

import re    
my_list = ['fun','3.25','4.222','cool','82.356','go','foo','255.224']
new_list = []
for pos, st in enumerate(my_list):
    if not re.search('[0-9]*?[.][0-9]*', st):
        new_list.append(st)
print new_list

创建新列表可避免处理您正在迭代的同一列表。

我认为,Ewans的答案更清洁,更快捷。