Python中带单位字符串列表的数值提取与转换教程

霞舞
发布: 2025-11-07 12:35:17
原创
309人浏览过

Python中带单位字符串列表的数值提取与转换教程

本教程旨在指导如何在python中高效处理包含数字、单位(如“m”表示百万,“b”表示十亿)以及特定文本(如“damages not recorded”)的字符串列表。我们将详细解析常见的编码误区,并提供一套清晰、专业的解决方案,演示如何将这些混合数据类型转换为统一的浮点数值格式,同时保留非数值信息,确保数据的准确性和可用性。

引言:处理混合数据类型字符串列表的挑战

在数据处理中,我们经常会遇到包含混合数据类型的字符串列表。例如,一个列表可能包含表示金额的字符串,这些金额带有单位(如“100M”表示1亿,“1.42B”表示14.2亿),也可能包含特殊的文本标记(如“Damages not recorded”)。将这类数据转换为统一的数值格式,同时妥善处理非数值部分,是数据清洗的关键一步。

本教程将以一个具体的示例数据 damages 列表为例,展示如何将其中的金额字符串转换为浮点数,并将非数值标记保留下来。

damages = ['Damages not recorded', '100M', 'Damages not recorded', '40M', '27.9M', '5M', 'Damages not recorded', '306M', '2M', '65.8M', '326M', '60.3M', '208M', '1.42B', '25.4M', 'Damages not recorded', '1.54B', '1.24B', '7.1B', '10B', '26.5B', '6.2B', '5.37B', '23.3B', '1.01B', '125B', '12B', '29.4B', '1.76B', '720M', '15.1B', '64.8B', '91.6B', '25.1B']
登录后复制

我们的目标是生成一个新的列表,其中所有以“M”或“B”结尾的字符串都被转换为相应的浮点数值,而“Damages not recorded”则保持不变。

常见误区与错误分析

在尝试解决此类问题时,初学者常会遇到一些逻辑和语法上的错误。以下是一个典型的错误尝试及其分析:

立即学习Python免费学习笔记(深入)”;

damage_update = []
while len(damage) > len(damage_update): # 错误1: damage未定义,且循环条件不合理
  for damage in damages: # 错误2: 在while循环内重复遍历,导致无限循环或逻辑错误
    if damages.find(M): # 错误3: damages是列表,没有find方法;M未定义,应为字符串字面量
        damage_update.append(damages.update(1000000,0)) # 错误4: damages是列表,没有update方法;参数不正确
    elif : # 错误5: elif后缺少条件
            damages.find(B): # 错误6: 同错误3
            damage_update.append(damages.update(1000000000,0)) # 错误7: 同错误4
        else:
            damage_update.append(damages.update("Damages not recorded")) # 错误8: 同错误4
    print(damage_update) # 错误9: 在循环内频繁打印,输出冗余
print(damage_update)
登录后复制

错误分析要点:

  1. 不恰当的循环结构: while len(damage) > len(damage_update) 存在问题。首先,damage 在 while 循环外部没有定义。其次,即使定义了,在 while 循环内部嵌套 for 循环,并且 damage_update 的增长速度与 damage 的长度无关,这可能导致无限循环或不正确的行为。正确的做法通常是使用一个简单的 for 循环遍历原始列表。
  2. 方法调用错误: damages.find(M) 是一个常见错误。damages 是一个列表,它没有 find() 方法。find() 是字符串的方法,应该应用于列表中的单个字符串元素。此外,M 和 B 应该用引号括起来,表示字符串字面量,例如 'M'。
  3. 不存在的方法: damages.update() 是一个严重的错误。Python 的列表(list)类型并没有名为 update() 的方法。update() 方法通常与字典(dictionary)或集合(set)相关联。对于列表,我们通常使用 append() 来添加元素,或者通过索引进行修改。
  4. 条件语句不完整: elif : 后面缺少一个条件表达式,导致语法错误。
  5. 不必要的输出: 在循环的每一次迭代中都打印 damage_update 会产生大量中间结果,使得最终输出难以阅读。通常,我们会在循环结束后打印最终结果。

正确的解决方案:逐步构建数据转换函数

为了实现目标,我们需要一个结构清晰、逻辑严谨的函数。以下是构建该函数的步骤和代码实现。

表单大师AI
表单大师AI

一款基于自然语言处理技术的智能在线表单创建工具,可以帮助用户快速、高效地生成各类专业表单。

表单大师AI 74
查看详情 表单大师AI

1. 定义转换函数

首先,将所有转换逻辑封装在一个函数中,这有助于代码的模块化和复用性。函数将接收原始的 damages 列表作为参数,并返回一个新的已处理的列表。

def update_damages(damages_list):
    damage_update = []
    # 转换逻辑将在此处实现
    return damage_update
登录后复制

2. 遍历列表并处理每个元素

使用一个 for 循环迭代 damages_list 中的每一个元素。在每次迭代中,我们将检查当前元素并根据其内容进行相应的转换。

def update_damages(damages_list):
    damage_update = []
    for damage_item in damages_list: # 遍历列表中的每一个损害记录
        # 处理 damage_item
        pass # 占位符
    return damage_update
登录后复制

3. 实现条件判断和数值转换逻辑

对于每个 damage_item,我们需要执行以下判断:

  • 如果它是“Damages not recorded”,则直接添加到新列表中。
  • 如果它以“M”结尾,则去除“M”,将剩余部分转换为浮点数,并乘以 1,000,000。
  • 如果它以“B”结尾,则去除“B”,将剩余部分转换为浮点数,并乘以 1,000,000,000。

我们可以使用字符串的 endswith() 方法来检查单位,以及 replace() 或 split() 方法来提取数值部分。

def update_damages(damages_list):
    damage_update = []
    for damage_item in damages_list:
        if damage_item == 'Damages not recorded':
            damage_update.append(damage_item)
        elif damage_item.endswith('M'):
            # 去除 'M',转换为浮点数,然后乘以 1,000,000
            value_str = damage_item.replace('M', '')
            try:
                value_float = float(value_str) * 1_000_000 # 使用下划线增加数字可读性
                damage_update.append(value_float)
            except ValueError:
                # 处理转换失败的情况,例如 'XM' 但 X 不是有效数字
                damage_update.append(f"Invalid M value: {damage_item}")
        elif damage_item.endswith('B'):
            # 去除 'B',转换为浮点数,然后乘以 1,000,000,000
            value_str = damage_item.replace('B', '')
            try:
                value_float = float(value_str) * 1_000_000_000
                damage_update.append(value_float)
            except ValueError:
                # 处理转换失败的情况
                damage_update.append(f"Invalid B value: {damage_item}")
        else:
            # 处理其他未知格式的字符串
            damage_update.append(f"Unrecognized format: {damage_item}")
    return damage_update
登录后复制

4. 完整的示例代码

将上述逻辑整合,并使用提供的 damages 数据进行测试:

damages = ['Damages not recorded', '100M', 'Damages not recorded', '40M', '27.9M', '5M', 'Damages not recorded', '306M', '2M', '65.8M', '326M', '60.3M', '208M', '1.42B', '25.4M', 'Damages not recorded', '1.54B', '1.24B', '7.1B', '10B', '26.5B', '6.2B', '5.37B', '23.3B', '1.01B', '125B', '12B', '29.4B', '1.76B', '720M', '15.1B', '64.8B', '91.6B', '25.1B']

def update_damages(damages_list):
    """
    将包含M/B单位的损害字符串转换为浮点数,
    并保留'Damages not recorded'字符串。
    """
    damage_update = []
    for damage_item in damages_list:
        if damage_item == 'Damages not recorded':
            damage_update.append(damage_item)
        elif damage_item.endswith('M'):
            # 处理以'M'结尾的字符串 (百万)
            value_str = damage_item.replace('M', '')
            try:
                value_float = float(value_str) * 1_000_000
                damage_update.append(value_float)
            except ValueError:
                print(f"警告: 无法将 '{damage_item}' 转换为浮点数。保留原始字符串。")
                damage_update.append(damage_item)
        elif damage_item.endswith('B'):
            # 处理以'B'结尾的字符串 (十亿)
            value_str = damage_item.replace('B', '')
            try:
                value_float = float(value_str) * 1_000_000_000
                damage_update.append(value_float)
            except ValueError:
                print(f"警告: 无法将 '{damage_item}' 转换为浮点数。保留原始字符串。")
                damage_update.append(damage_item)
        else:
            # 处理既不是特定字符串也不带M/B单位的其他格式
            print(f"警告: 发现未知格式 '{damage_item}'。保留原始字符串。")
            damage_update.append(damage_item)
    return damage_update

# 调用函数并打印结果
processed_damages = update_damages(damages)
for item in processed_damages:
    print(item)

# 打印前几个元素和总长度以验证
# print(processed_damages[:10])
# print(len(processed_damages))
登录后复制

注意事项与最佳实践

  1. 错误处理: 在进行字符串到浮点数的转换时,务必使用 try-except 块来捕获 ValueError。这可以防止因字符串内容无法转换为有效数字而导致程序崩溃,从而提高代码的健壮性。
  2. 代码可读性 使用有意义的变量名(如 damage_item 而不是 damage),并在长数字中使用下划线(如 1_000_000)可以显著提高代码的可读性。
  3. 函数封装: 将相关逻辑封装在函数中是良好的编程习惯,它使得代码更易于测试、维护和复用。
  4. 避免全局变量修改: 函数应该尽可能避免直接修改传入的列表。通常,创建一个新列表并返回是更安全、更可预测的做法。
  5. 明确的输出: 确保只在需要时打印结果,避免在循环内部进行不必要的输出,以保持控制台的整洁。

总结

通过本教程,我们学习了如何处理包含混合数据类型的字符串列表,特别是如何将带有单位(M、B)的字符串转换为浮点数值,同时保留特定的文本标记。我们分析了常见的编程错误,并提供了一个健壮、高效的Python解决方案,该方案利用了函数封装、条件判断、字符串方法和错误处理机制。掌握这些技巧将有助于您在数据清洗和预处理任务中更加得心应手。

以上就是Python中带单位字符串列表的数值提取与转换教程的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号