为什么';这个Python代码是否从列表中删除了一个数字?
为什么';这个Python代码是否从列表中删除了一个数字?,python,Python,isdigit()在这里不起作用: li=["word",'2.134123'] for i in li: if i.isdigit(): li.remove(i) 如果数字有小数,Isdigit不起作用。在这种情况下返回False。如果数字有小数,则数字无效。在这种情况下返回False。请参阅 str.isdigit() 如果字符串中的所有字符都是数字和,则返回True 至少有一个字符,False否则 字符串还包含小数点,这就是函数返回False的原因,请参见 str.isdigit(
isdigit()
在这里不起作用:
li=["word",'2.134123']
for i in li:
if i.isdigit():
li.remove(i)
如果数字有小数,Isdigit不起作用。在这种情况下返回False。如果数字有小数,则数字无效。在这种情况下返回False。请参阅
str.isdigit()
如果字符串中的所有字符都是数字和,则返回True
至少有一个字符,False
否则
字符串还包含小数点,这就是函数返回False
的原因,请参见
str.isdigit()
如果字符串中的所有字符都是数字和,则返回True
至少有一个字符,False
否则
您的字符串还包含小数点,这就是为什么函数返回
False
isdigit
未通过对表示为字符串的浮点的检查
isdigit
的帮助指定:
Return True if all characters in S are digits
and there is at least one character in S, False otherwise.
因此,有了这些,你的工作将是找到其他方法来确定某些东西是否确实通过了“数字”检查
您可以做的是将尝试在try/except中将每个项转换为浮点,然后将属于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']
另一种方法是修改函数,根据float
测试简单地返回True
或False
,并利用remove\u numbers
方法的结果“过滤”列表。(谢谢@Pynchia)
就性能而言,两者之间没有真正的优势,这可能是因为过滤器
实现中的增益是由调用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
python3-mtimeit-s'from remove\u float导入remove\u number\u循环;从随机导入randint'-s'l=[str(i)if randint(0100)<20 else“abc”+str(i)for i in range(1000000)]'-s'删除\u编号\u循环(l)'
python3-mtimeit-s'from remove_float导入remove_number_过滤器;从随机导入randint'-s'l=[str(i)if randint(0100)<20 else“abc”+str(i)for i in range(1000000)]'-s'删除\u数字\u过滤器(l)'
100000000个循环,最好为3个:每个循环0.00929 usec
100000000个循环,每个循环3:0.0107 usec的最佳值
isdigit
未通过对表示为字符串的浮点的检查
isdigit
的帮助指定:
Return True if all characters in S are digits
and there is at least one character in S, False otherwise.
因此,有了这些,你的工作将是找到其他方法来确定某些东西是否确实通过了“数字”检查
您可以做的是将尝试在try/except中将每个项转换为浮点,然后将属于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']
另一种方法是修改函数,根据float
测试简单地返回True
或False
,并利用remove\u numbers
方法的结果“过滤”列表。(谢谢@Pynchia)
就性能而言,两者之间没有真正的优势,这可能是因为过滤器
实现中的增益是由调用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
python3-mtimeit-s'from remove\u float导入remove\u number\u循环;从随机导入randint'-s'l=[str(i)if randint(0100)<20 else“abc”+str(i)for i in range(1000000)]'-s'删除\u编号\u循环(l)'
python3-mtimeit-s'from remove_float导入remove_number_过滤器;从随机导入randint'-s'l=[str(i)if randint(0100)<20 else“abc”+str(i)for i in range(1000000)]'-s'删除\u数字\u过滤器(l)'
100000000个循环,最好为3个:每个循环0.00929 usec
100000000个循环,每个循环3:0.0107 usec的最佳值
您在迭代列表时正在修改列表,这将导致出现问题。另外,“.”不是数字字符。.isdigit()
用于int
,而不是float
。看看有没有解决办法。此外,在遍历易变对象(如列表)时,不应修改它,否则将得到意外的结果。isdigits不适用于float。请看这里,您在迭代列表时正在修改列表,这将导致问题。另外,“.”不是数字字符。.isdigit()
用于int
,而不是float
。看看有没有解决办法。此外,在遍历易变对象(如列表)时,不应修改它,否则将得到意外的结果。isdigits不适用于float。看这里。代码可以放在函数中,比如说不是浮点数。它将只返回True/False,没有附加。然后简单地使用过滤器(is\u not\u float,li)
(转换为列表,如果在py3上)嗯。。。考虑到您正在创建一个新的列表,我认为我的观点是filter
比添加for循环要快。如果你愿意的话,请再读一遍我的评论。函数应仅检查值是否为浮点值。只是我的想法,没有令人信服的理由改变code@Pynchia你太棒了。干杯。我冒昧地编辑了你的代码,删除了一个不必要的for
循环,这很有趣。再看看这个:投票率高。代码可以放在函数中,比如说不是浮点数。它将只返回True/False,没有附加。然后简单地使用过滤器(is\u not\u float,li)
(转换为列表,如果在py3上)嗯。。。考虑到您正在创建一个新的列表,我认为我的观点是filter
比添加for循环要快。如果你愿意的话,请再读一遍我的评论。函数应仅检查值是否为浮点值。只是我的想法,没有令人信服的理由改变code@Pynchia你太棒了。干杯。我冒昧地编辑了你的代码,删除了一个不必要的for
循环,这很有趣。再看看这个: