0

0

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

霞舞

霞舞

发布时间:2025-11-07 12:35:17

|

341人浏览过

|

来源于php中文网

原创

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 会产生大量中间结果,使得最终输出难以阅读。通常,我们会在循环结束后打印最终结果。

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

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

Vozo
Vozo

Vozo是一款强大的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开发工具
python开发工具

php中文网为大家提供各种python开发工具,好的开发工具,可帮助开发者攻克编程学习中的基础障碍,理解每一行源代码在程序执行时在计算机中的过程。php中文网还为大家带来python相关课程以及相关文章等内容,供大家免费下载使用。

706

2023.06.15

python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

624

2023.07.20

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

734

2023.07.25

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

616

2023.07.31

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

1234

2023.08.03

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

547

2023.08.04

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

573

2023.08.04

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

694

2023.08.11

苹果官网入口直接访问
苹果官网入口直接访问

苹果官网直接访问入口是https://www.apple.com/cn/,该页面具备0.8秒首屏渲染、HTTP/3与Brotli加速、WebP+AVIF双格式图片、免登录浏览全参数等特性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

10

2025.12.24

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 0.6万人学习

Django 教程
Django 教程

共28课时 | 2.4万人学习

SciPy 教程
SciPy 教程

共10课时 | 0.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

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