isdigit()
在这里不起作用:
li=["word",'2.134123']
for i in li:
if i.isdigit():
li.remove(i)
答案 0 :(得分:3)
isdigit
未通过对表示为字符串的浮点数的检查。
isdigit
的帮助指定:
Return True if all characters in S are digits
and there is at least one character in S, False otherwise.
因此,通过这种方式,您的工作将是找到一些其他方法来确定某些事实上是否通过了“数字”检查。
您可以做的是尝试将每个项目转换为try / except中的浮点数,然后追加到列表中的每个项目的新列表:
def remove_numbers(li):
numberless = []
for i in li:
try:
float(i)
except:
numberless.append(i)
return numberless
res = remove_numbers(["word",'2.134123'])
print(res)
# outputs ['word']
另一种方法是修改函数,根据True
测试返回False
或float
,并使用filter“过滤”列表基于remove_numbers
方法的结果。 (谢谢@Pynchia)
def not_a_float(s):
try:
float(s)
return False
except:
return True
res = filter(not_a_float, ["word", '2.134123'])
就性能而言,两者之间没有真正的优势,可能是因为filter
not_a_float
的实现收益
python3 -mtimeit -s'from remove_floats import remove_numbers_loop; from random import randint' -s'l=[str(i) if randint(0,100)< 20 else "abc"+str(i) for i in range(1000000)]' -s 'remove_numbers_loop(l)'
python3 -mtimeit -s'from remove_floats import remove_numbers_filter; from random import randint' -s'l=[str(i) if randint(0,100)< 20 else "abc"+str(i) for i in range(1000000)]' -s 'remove_numbers_filter(l)'
100000000 loops, best of 3: 0.00929 usec per loop
100000000 loops, best of 3: 0.0107 usec per loop
答案 1 :(得分:2)
如果数字有小数,则Isdigit不起作用。在这种情况下返回False。
答案 2 :(得分:1)
请参阅https://docs.python.org/2/library/stdtypes.html
str.isdigit()
如果字符串中的所有字符都是数字,则返回
True
除此之外至少有一个字符False
。
您的字符串还包含小数点以及该函数返回False
的原因。