在Python中将所有非数字转换为0(零)
我正在寻找将Python中所有非数字数据(包括空格)转换为零的最简单方法。以以下为例:在Python中将所有非数字转换为0(零),python,Python,我正在寻找将Python中所有非数字数据(包括空格)转换为零的最简单方法。以以下为例: someData = [[1.0,4,'7',-50],['8 bananas','text','',12.5644]] 我希望输出如下: desiredData = [[1.0,4,7,-50],[0,0,0,12.5644]] 因此,“7”应该是7,但“8”应该转换为0。作为替代,您可以在嵌套列表中使用decimal模块: >>> [[Decimal(i) if (isinstanc
someData = [[1.0,4,'7',-50],['8 bananas','text','',12.5644]]
我希望输出如下:
desiredData = [[1.0,4,7,-50],[0,0,0,12.5644]]
因此,“7”应该是7,但“8”应该转换为0。作为替代,您可以在嵌套列表中使用
decimal
模块:
>>> [[Decimal(i) if (isinstance(i,str) and i.isdigit()) or isinstance(i,(int,float)) else 0 for i in j] for j in someData]
[[Decimal('1'), Decimal('4'), Decimal('7'), Decimal('-50')], [0, 0, 0, Decimal('12.56439999999999912461134954')]]
请注意,Decimal
的优点是,在第一个条件下,您可以使用它获取数字字符串的十进制值,以及浮点和整数的浮点表示形式:
>>> Decimal('7')+3
Decimal('10')
它适用于不同的数字类型:
In [4]: from decimal import Decimal
In [5]: someData = [[1.0,4,'7',-50 ,"99", Decimal("1.5")],["foobar",'8 bananas','text','',12.5644]]
In [6]: for sub in someData:
...: sub[:] = map(mapped,sub)
...:
In [7]: someData
Out[7]: [[1.0, 4, 7, -50, 99, Decimal('1.5')], [0, 0, 0, 0, 12.5644]]
如果isinstance(x,numbers.Number)
捕获已浮动的子元素、整数等。。如果它不是数字类型,我们首先尝试将其强制转换为int,然后再转换为float,如果这些转换都不成功,我们只需返回0
整数、float和引号中的负数即可:
def is_number(s):
try:
float(s)
return True
except ValueError:
return False
def is_int(s):
try:
int(s)
return True
except ValueError:
return False
someData=[[1.0,4,'7',-50,'12.333','-90',['-333.90','8香蕉','text','12.5644]]
for l in someData:
for i, el in enumerate(l):
if isinstance(el, str) and not is_number(el):
l[i] = 0
elif isinstance(el, str) and is_int(el):
l[i] = int(el)
elif isinstance(el, str) and is_number(el):
l[i] = float(el)
print(someData)
输出:
[[1.0, 4, 7, -50, 12.333, -90], [-333.9, 0, 0, 0, 12.5644]]
考虑到同时需要int和float数据类型,应尝试以下代码:
desired_data = []
for sub_list in someData:
desired_sublist = []
for element in sub_list:
try:
some_element = eval(element)
desired_sublist.append(some_element)
except:
desired_sublist.append(0)
desired_data.append(desired_sublist)
这可能不是最好的方法,但它仍然可以完成您要求的任务。另一种使用正则表达式的解决方案
lists = [[1.0,4,'7',-50], ['1', 4.0, 'banana', 3, "12.6432"]]
nlists = []
for lst in lists:
nlst = []
for e in lst:
# Check if number can be a float
if '.' in str(e):
try:
n = float(e)
except ValueError:
n = 0
else:
try:
n = int(e)
except ValueError:
n = 0
nlst.append(n)
nlists.append(nlst)
print(nlists)
import re
def toNumber(e):
if type(e) != str:
return e
if re.match("^-?\d+?\.\d+?$", e):
return float(e)
if re.match("^-?\d+?$", e):
return int(e)
return 0
someData = [[1.0,4,'7',-50],['8 bananas','text','',12.5644]]
someData = [map(toNumber, list) for list in someData]
print(someData)
你会得到:
[[1.0, 4, 7, -50], [0, 0, 0, 12.5644]]
[[1.0, 4, 7, -50], [0, 0, 0, 12.5644]]
注意它不适用于科学记数法中的数字我假设您所指的空格是空字符串。因为您希望转换所有字符串,而不管它们是否包含字符。我们可以简单地检查对象的类型是否为字符串。如果是,我们可以将其转换为整数0
cleaned_data = []
for array in someData:
for item in array:
cleaned_data.append(0 if type(item) == str else item)
>>>cleaned_data
[1.0, 4, 0, -50, 0, 0, 0, 12.5644]
毫不奇怪,Python有一种方法可以检查某个东西是否是数字:
import collections
import numbers
def num(x):
try:
return int(x)
except ValueError:
try:
return float(x)
except ValueError:
return 0
def zeronize(data):
return [zeronize(x) if isinstance(x, collections.Sequence) and not isinstance(x, basestring) else num(x) for x in data]
someData = [[1.0,4,'7',-50],['8 bananas','text','',12.5644]]
desiredData = zeronize(someData)
如果有任意深度的嵌套列表,则会定义函数。如果使用Python3.x,请将
basestring
替换为str
这和问题可能是相关的。此外,和。一个衬里:
import re
result = [[0 if not re.match("^(\d+(\.\d*)?)$|^(\.\d+)$", str(s)) else float(str(s)) if not str(s).isdigit() else int(str(s)) for s in xs] for xs in somedata]
>>> result
[[1.0, 4, 7, 0], [0, 0, 0, 12.5644]]
对于不希望更改类型的数字类型,我的意思是希望int转换为float,反之亦然,如果您的目标是单一类型(而不是数字类型),则会更容易。我喜欢这种方法的简单性,但它将“7”转换为0,而不是7。@user1882017,谢谢我错过了“7…”。。。增加了isdigit(0)检查
desiredData = `[[1, 4, 7, -50], [0, 0, 0, 12]]`
import re
result = [[0 if not re.match("^(\d+(\.\d*)?)$|^(\.\d+)$", str(s)) else float(str(s)) if not str(s).isdigit() else int(str(s)) for s in xs] for xs in somedata]
>>> result
[[1.0, 4, 7, 0], [0, 0, 0, 12.5644]]