我有一个包含不规则字词和{{1}}个数字的列表,我想从列表中删除所有这些float
个数字,但首先我需要找到一种方法来检测它们。我知道float
可以区分数字,但它不适用于str.isdigit()
个数字。怎么做?
我的代码是这样的:
float
答案 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)]
这将删除int
和float
值的字符串表示形式(即任何字符串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的答案更清洁,更快捷。