Python 列表操作,转换字母数字数据,同时跳过列表中的其他数据

Python 列表操作,转换字母数字数据,同时跳过列表中的其他数据,python,list,dictionary,alphanumeric,string-conversion,Python,List,Dictionary,Alphanumeric,String Conversion,谢谢你能提供的帮助。如果还有其他与这个问题相关的帖子/视频/文章,我很乐意查看 语言:Python 我的问题是:如何正确地构造下面的代码来跳过列表中的“N/A”和“2019年12月25日”=num 我找到了如何将字母数字值(如“1.19T”)转换为浮点数的答案,但我不知道如何跳过列表中的日期和“N/A”。任何帮助都将不胜感激,谢谢 num = ["11.1", "1.19T", "22.14", "2.09B", "4.57%", "12.92", "N/A", "Dec 25 2019"] u

谢谢你能提供的帮助。如果还有其他与这个问题相关的帖子/视频/文章,我很乐意查看

语言:Python

我的问题是:如何正确地构造下面的代码来跳过列表中的“N/A”和“2019年12月25日”=num

我找到了如何将字母数字值(如“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)

基本上,您试图将单元处理与无效值分开,因为现在它们由相同的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块。但是,“显式比隐式好”,所以我更喜欢上面的一个。

使用
re

首先,我必须从您的
单元中删除空字符串键

units={“M”:1000,“B”:1000,“T”:1000,“%”:.01}
然后我遍历所有元素和所有保存的单位,以将所有文字修改为正确的算术运算:

>>num\u formatted=[]
>>>对于el in num:
...     x=el
...     以单位表示的k:
...         x=re.sub(r“([0-9\.]+)”+k,r“(\1*”+str(单位[k])+”),x)
...     num_格式化。追加(x)
...
>>>打印(num_格式)
[11.1'、'(1.19*100000000)'、'22.14'、'(2.09*1000000)'、'4.57*0.01'、'12.92'、'N/A'、'2019年12月25日'
多亏了这种方法,每个文本可以有多个单位,所有的计算都应该是算术正确的

一旦完成,我们就可以
eval
所有格式化操作:

>>将numpy作为np导入
>>>num_formatted_final=[]
>>>对于以num_格式显示的el:
...     尝试:
...         num_格式_final.append(eval(el))
...     除:
...         num_formatted_final.append(np.nan)#您可以将None替换为None-我认为np.nan是更符合逻辑的选择
...
>>>num_格式_最终
[11.1190000000.0,22.142089999.999999998,0.04570000000000005,12.92,nan,nan]

这些数据来自哪里?使用
None
可能比使用神奇字符串要好得多。您能提供更多的上下文/信息吗?明智的做法是将数据拆分为同质部分,而不是混合不同的数据格式。但如果您坚持将所有字符串存储到一个列表中(或者如果它们在输入时是混合的),那么regex似乎是您唯一的选择。这里的危险在于日期本身有许多不同的格式。您可以在外部的
except
子句中添加另一个
try/except
,这样,如果第二次转换失败,它将继续
。我只是想通过从“估值指标”和“财务亮点”中提取信息,更好地理解Python的网络抓取。