我有一个仅包含字符串甚至数字的列表,我只想将数字值转换为整数并将其他所有内容保留为字符串
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.
这是我尝试过的:
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.