我有一个仅包含字符串甚至数字的列表,我只想将数字值转换为整数并将其他所有内容保留为字符串

I have a list that contains only strings even with numbers, I want to convert only the number values to ints and leave everything else as strings

这是我尝试过的:

g = ["5", "-2", "4", "C", "D", "9", "+", "+"]

new = [int(x) if x == str(range(-100, 100)) else x for x in g]

print(new)

您可以通过剥离潜在的 - 然后测试其余的 isnumeric() 来测试整数。例如:

g = ["5", "-2", "4", "C", "D", "9", "+", "+"]

new = [int(x) if x.lstrip('-').isnumeric() else x for x in g]

print(new)
# [5, -2, 4, 'C', 'D', 9, '+', '+']

编辑:

正如其他人所指出的,还有其他边缘情况不在您的输入中。一个更强大的解决方案是定义一个函数,该函数明确确定您要如何转换字符串......更像是:

g = ["5", "-2", "4", "C", "D", "9", "+5", "+", "-", "--3", "⓪⑧"]

def str2int(s):
    try:
        return int(s)
    except ValueError:
        return s
    
new = [str2int(n) for n in g]
[5, -2, 4, 'C', 'D', 9, 5, '+', '-', '--3', '⓪⑧']

我相信你的策略是生成一组与可能的数字相对应的字符串,并检查每个字符串是否在该组中。

您可以这样做:

numbers = set(str(x) for x in range(-100,100))
new     = [ int(x) if x in numbers else x for x in g ]

这将您限制在您需要提前知道的特定数字范围内(它也不包括“+3”或“005”等情况)。

一种常见的做法是“请求原谅而不是许可”,这意味着尝试将每个项目转换为数字,如果失败则使用原始字符串:

new = list()
for x in g:
    try:    
        new.append(int(x.strip()))  # try to add x as an integer
    except ValueError: 
        new.append(x)       # use original string if it fails

如果你必须在列表理解中这样做,你可以使用字符串的 .isdigit() 方法,但你必须考虑可能在第一个位置的 + 或 - 符号:

new = [int(x) if x[x[:1] in "+-":].isdecimal() else x for x in g]

注意,我正在使用 . isdecimal() 而不是 .isnumeric() 或 .isdigit() 以避免在转换特殊字符时出错,例如“一二三四五”或“2²”,其中 isnumeric()/isdigit() 为 True 但不能被处理整数()。还有 leading/trailing 个空格的情况,这不包括在内。由于要处理所有边缘情况,try/except 方法似乎很多 simpler/safer.