1

我有一个文本文件,我读到了一个列表。此列表包含整数和字符串。

例如,我的列表可能如下所示:

["name", "test", "1", "3", "-3", "name" ...]

现在,我想使用.isdigit()方法或isinstance()函数将所有数字转换为整数。例如:

for i in range len(mylist):
    if mylist[i].isdigit():
        mylist[i] =  int(mylist[i])

问题是"-3".isdigit()例如会返回False. 有关规避问题并将负数字字符串转换为负整数的简单解决方案的任何提示?

4

3 回答 3

9

该方法仅测试数字,而-不是数字。如果要检测整数,则需要测试int()并捕获异常:ValueError

for i, value in enumerate(mylist):
    try:
        mylist[i] = int(value)
    except ValueError:
        pass  # not an integer

换句话说,不需要显式测试;只需转换并捕获异常。请求宽恕而不是请求许可。

于 2013-03-30T15:29:01.773 回答
0

尝试一下,如果失败则捕获异常:

try:
    return int(obj)
except ValueError:
    ...

Python 认为请求宽恕比请求许可更容易。在你跳跃之前查看通常更慢,更难阅读,并且经常会引入竞争条件(不是在这种情况下,而是在一般情况下)。

此外,像这样就地修改列表是一个坏主意,因为在 Python 中通过索引访问很慢。相反,考虑使用这样的列表推导

def intify(obj):
    try:
        return int(obj)
    except ValueError:
        return obj

mylist_with_ints = [intify(obj) for obj in mylist]

这将使用修改后的值创建一个新列表,并且更具可读性和效率。

请注意,由于我们只是将函数应用于列表的每个项目,map()因此在这里也可以很好地工作:

mylist_with_ints = map(intify, mylist)

Note that if you need a list instead of an iterable in 3.x, you will want to wrap the map call in list().

于 2013-03-30T15:29:39.073 回答
0

The way to convert to integers is to try the conversion and be prepared for it to fail:

for i in range(len(mylist)):
    try:
        mylist[i] = int(mylist[i])
    except ValueError:
        pass
于 2013-03-30T15:29:57.483 回答