感谢您能提供的任何帮助。如果还有其他关于这个问题的帖子/视频/文章,我很乐意去看看。
语言: Python
我的问题:什么是正确的方式来构造下面的代码,以跳过列表= num中的"N/A“和"Dec 25 2019”。
我找到了如何将字母数字值"1.19T“转换为浮点数的答案,但我不知道如何跳过列表中的日期和"N/A”。任何帮助都会很感谢,谢谢。
num = ["11.1", "1.19T", "22.14", "2.09B", "4.57%", "12.92", "N/A", "Dec 25 2019"]
units = {"M": 1_000, "B": 1_000_000, "T": 1_000_000_000, "": 1, "%": .01}
result = []
for n in num:
try:
result.append(float(n))
except ValueError:
unit = n[-1]
n = float(n[:-1])
result.append(n * units[unit])
print(result)发布于 2020-01-06 06:31:57
基本上,您正在尝试将单元处理与无效值分开,因为现在它们由相同的try/except语句提供服务。一种(但不是唯一的)解决方案是显式地处理单元:
for n in num:
try:
if n[-1] in units:
n = float(n[:-1]) * units[n[-1]]
else:
n = float(n)
except ValueError:
continue
result.append(n)注释中建议的另一种方法是使用嵌套的try/except块。然而,“显式比隐式更好”,所以我更喜欢上面的。
发布于 2020-01-06 06:45:02
使用re
首先,我必须从你的units中删除空字符串密钥
units = {"M": 1_000, "B": 1_000_000, "T": 1_000_000_000, "%": .01}然后,我遍历所有元素和所有保存的单元,以将所有文字修改为正确的算术运算:
>>> num_formatted=[]
>>> for el in num:
... x=el
... for k in units:
... x=re.sub(r"([0-9\.]+)"+k, r"(\1 * "+str(units[k])+")", x)
... num_formatted.append(x)
...
>>> print(num_formatted)
['11.1', '(1.19 * 1000000000)', '22.14', '(2.09 * 1000000)', '(4.57 * 0.01)', '12.92', 'N/A', 'Dec 25 2019']多亏了这种方法,你可以有一个以上的单位每个文字,并且一切都应该算术计算正确。
一旦完成,我们就可以eval所有的格式化操作了:
>>> import numpy as np
>>> num_formatted_final=[]
>>> for el in num_formatted:
... try:
... num_formatted_final.append(eval(el))
... except:
... num_formatted_final.append(np.nan) #You can put None instead - I suppose np.nan is more logical choice here
...
>>> num_formatted_final
[11.1, 1190000000.0, 22.14, 2089999.9999999998, 0.045700000000000005, 12.92, nan, nan]https://stackoverflow.com/questions/59604657
复制相似问题