【问题标题】:Why doesn't this Python code removes a digit from a list? [duplicate]为什么这个 Python 代码不从列表中删除一个数字? [复制]
【发布时间】:2019-10-15 05:36:10
【问题描述】:

isdigit() 在这里不起作用:

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

【问题讨论】:

  • 您在迭代列表时正在修改它,这会导致问题。还, '。'不是数字字符。
  • .isdigit() 旨在用于int,而不是float。查看this question 的解决方法。此外,您不应在迭代时修改列表等可变对象,否则会得到意想不到的结果。
  • isdigits 不适用于浮点数。见这里stackoverflow.com/questions/4138202/…

标签: python


【解决方案1】:

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']

另一种方法是修改函数以根据float 测试简单地返回True 或False,并利用filter 根据@987654330 的结果“过滤”列表@ 方法。 (感谢@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

【讨论】:

  • 赞成。代码可以放在一个函数中,比如is_not_float。它只会返回真/假,不附加。然后只需使用filter(is_not_float, li)(转换为列表,如果在py3上)
  • ahem... 鉴于您正在创建一个新列表,我认为filter 比在 for 循环中附加要快,我认为。如果您愿意,请再次阅读我的评论。该函数应该只检查一个值不是/是一个浮点数。只是我的想法,没有令人信服的理由更改代码
  • @Pynchia +1 你太棒了。干杯。
  • 我冒昧地编辑了您的代码并删除了一个不必要的 for 循环
  • 这很有趣。也看看这个:stackoverflow.com/a/29508145/1832539
【解决方案2】:

如果数字有小数,Isdigit 不起作用。在这种情况下返回 False。

【讨论】:

    【解决方案3】:

    见https://docs.python.org/2/library/stdtypes.html

    str.isdigit()

    如果字符串中的所有字符都是数字,则返回True 至少有一个字符,否则False。

    您的字符串还包含小数点,这就是函数返回 False 的原因。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-16
      • 1970-01-01
      • 2012-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多