为什么这个Python代码不会从列表中删除数字?

时间:2015-11-02 20:46:34

标签: python

isdigit()在这里不起作用:

li=["word",'2.134123']
for i in li:
 if i.isdigit():
  li.remove(i)

3 个答案:

答案 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测试返回Falsefloat,并使用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的原因。