Python中对NumPy数组内字典进行按值降序排序的实用教程

Python中对NumPy数组内字典进行按值降序排序的实用教程

本教程旨在解决如何对存储在NumPy数组中的字典进行按值降序排序的问题。通过详细步骤和代码示例,我们将学习如何从NumPy数组中提取字典、使用sorted()函数结合lambda表达式按字典值进行排序,并最终重构一个有序字典,这对于从数据中提取如“伤亡人数最多的城市”等关键信息至关重要。

1. 问题背景与数据结构

在数据处理过程中,我们经常会将统计结果聚合到一个字典中,例如统计各个城市的总伤亡人数。有时,这个字典可能会被意外或有意地封装在一个numpy数组中。例如,在处理csv文件后,我们可能得到一个城市伤亡人数的字典,如下所示:

import csvimport numpy as npcity_dict = {'New Delhi': 2095, 'Samastipur': 4, 'Bombay': 210, 'Imphal': 603, 'Aizawl': 2, 'Amapur': 2, 'Raisikah': 1, 'Champhai': 1, 'Jamshedpur': 32, 'Chennai': 366, 'Chiaplant': 1, 'Tindol': 7, 'Calcutta': 57, 'Tirupattur': 6, 'Gauhati': 112, 'Jorhat': 3, 'Massad': 1, 'Chandigarh': 333, 'Jodhpur': 2, 'Amritsar': 768, 'Tipaimukh': 6, 'Guwahati': 822, 'Harchowal': 1, 'Mothan Wala': 2, 'Qadian': 7, 'Baloda Bazar': 10}# 将字典放入NumPy数组np_city = np.array(city_dict)print("原始NumPy数组内容:")print(np_city)print("NumPy数组类型:", type(np_city))print("NumPy数组元素类型:", np_city.dtype)

运行上述代码,你会发现np_city实际上是一个包含单个字典对象的NumPy数组,其dtype为object。这意味着NumPy并没有将字典的键值对进行向量化处理,而是将整个字典作为一个元素存储。

原始NumPy数组内容:{'New Delhi': 2095, 'Samastipur': 4, 'Bombay': 210, 'Imphal': 603, 'Aizawl': 2, 'Amapur': 2, 'Raisikah': 1, 'Champhai': 1, 'Jamshedpur': 32, 'Chennai': 366, 'Chiaplant': 1, 'Tindol': 7, 'Calcutta': 57, 'Tirupattur': 6, 'Gauhati': 112, 'Jorhat': 3, 'Massad': 1, 'Chandigarh': 333, 'Jodhpur': 2, 'Amritsar': 768, 'Tipaimukh': 6, 'Guwahati': 822, 'Harchowal': 1, 'Mothan Wala': 2, 'Qadian': 7, 'Baloda Bazar': 10}NumPy数组类型: NumPy数组元素类型: object

我们的目标是根据字典的值(例如,总伤亡人数)对这个字典进行降序排序,以便快速找出伤亡最多的城市。

2. 从NumPy数组中提取字典

由于np_city是一个只包含一个元素的NumPy数组(这个元素就是我们的字典),我们需要使用item()方法来提取这个字典对象。

# 提取NumPy数组中的字典extracted_dict = np_city.item()print("n提取出的字典类型:", type(extracted_dict))print("提取出的字典内容:", extracted_dict)

item()方法会返回数组中的唯一元素。如果数组包含多个元素,调用item()会引发ValueError。

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

3. 对字典进行按值降序排序

一旦我们获得了原始字典,就可以使用Python内置的sorted()函数结合lambda表达式对其进行排序。

sorted()函数可以接受一个可迭代对象(如字典的items()视图)和一个key参数,key参数是一个函数,用于从每个元素中提取一个比较键。

extracted_dict.items(): 这会返回一个包含字典所有键值对的视图对象,形式为(key, value)元组的列表。key=lambda item: item[1]: 这里的lambda函数定义了一个匿名函数,它接受一个item(即一个(key, value)元组),并返回item[1](即元组的第二个元素,也就是字典的值)。sorted()函数将根据这个返回值进行排序。reverse=True: 这个参数指示sorted()函数进行降序排序。

# 对字典的items进行排序sorted_items = sorted(extracted_dict.items(), key=lambda item: item[1], reverse=True)print("n排序后的键值对列表:")print(sorted_items)

sorted_items现在是一个按值降序排列的(key, value)元组列表。

4. 重构为有序字典

Python 3.7+ 版本保证了字典会保留插入顺序。因此,我们可以使用字典推导式(Dictionary Comprehension)将排序后的元组列表转换回一个有序字典。

# 使用字典推导式重构为有序字典sorted_city_dict = {key: value for key, value in sorted_items}print("n最终按伤亡人数降序排列的城市字典:")print(sorted_city_dict)

最终输出的sorted_city_dict将是一个按照城市伤亡人数从高到低排列的字典。

最终按伤亡人数降序排列的城市字典:{'New Delhi': 2095, 'Guwahati': 822, 'Amritsar': 768, 'Imphal': 603, 'Chennai': 366, 'Chandigarh': 333, 'Bombay': 210, 'Gauhati': 112, 'Calcutta': 57, 'Jamshedpur': 32, 'Baloda Bazar': 10, 'Tindol': 7, 'Qadian': 7, 'Tirupattur': 6, 'Tipaimukh': 6, 'Samastipur': 4, 'Jorhat': 3, 'Aizawl': 2, 'Amapur': 2, 'Jodhpur': 2, 'Mothan Wala': 2, 'Raisikah': 1, 'Champhai': 1, 'Chiaplant': 1, 'Massad': 1, 'Harchowal': 1}

5. 完整代码示例

下面是结合了数据读取、处理和排序的完整代码示例(假设terrorismData.csv文件存在且格式正确):

import csvimport numpy as npdef get_top_cities_by_casualties(csv_file_path, country='India', top_n=5):    """    从CSV文件中读取数据,计算指定国家各城市的总伤亡人数,    并返回按伤亡人数降序排列的前N个城市。    Args:        csv_file_path (str): CSV文件路径。        country (str): 要筛选的国家名称。        top_n (int): 要返回的前N个城市。    Returns:        dict: 按伤亡人数降序排列的前N个城市字典。    """    city_casualties = {}    try:        with open(csv_file_path, 'r', encoding='utf-8') as file_obj:            data_reader = csv.DictReader(file_obj, skipinitialspace=True)            for row in data_reader:                if row['Country'] == country:                    # 处理空值并转换为整数                    killed = int(float(row['Killed'])) if row['Killed'] else 0                    wounded = int(float(row['Wounded'])) if row['Wounded'] else 0                    total_casualty = killed + wounded                    city = row['City']                    if city and city != 'Unknown':                                    city_casualties[city] = city_casualties.get(city, 0) + total_casualty    except FileNotFoundError:        print(f"错误: 文件 '{csv_file_path}' 未找到。")        return {}    except Exception as e:        print(f"处理文件时发生错误: {e}")        return {}    # 将字典放入NumPy数组(虽然在此场景下并非最佳实践,但为了演示而保留)    np_city_casualties = np.array(city_casualties)    # 提取字典    extracted_dict = np_city_casualties.item()    # 对字典进行按值降序排序    sorted_items = sorted(extracted_dict.items(), key=lambda item: item[1], reverse=True)    # 重构为有序字典并获取前N个    top_cities = {key: value for key, value in sorted_items[:top_n]}    return top_cities# 示例调用csv_path = 'terrorismData.csv' # 替换为你的CSV文件路径top_5_cities = get_top_cities_by_casualties(csv_path, top_n=5)print(f"n印度伤亡人数最多的前5个城市:")print(top_5_cities)

6. 注意事项与总结

NumPy数组封装字典的场景:将整个字典封装在NumPy数组中(如np.array(some_dict))通常不是NumPy的最佳使用方式,因为它创建了一个dtype=object的数组,并没有利用NumPy的数值计算优势。如果需要处理结构化数据,pandas DataFrame或NumPy的结构化数组通常是更好的选择。item()方法的限制:item()方法只能用于包含单个元素的NumPy数组。如果数组中有多个元素,你需要使用索引(例如np_array[0])来访问特定元素。Python字典的有序性:从Python 3.7+ 开始,字典会保留插入顺序。这意味着通过字典推导式从排序后的键值对列表重构的字典将保持排序后的顺序。lambda函数:lambda函数提供了一种简洁的方式来定义小型匿名函数,非常适合作为sorted()等函数的key参数。效率:对于中等大小的字典,这种排序方法是高效且易于理解的。

通过本教程,我们学习了如何处理NumPy数组中包含字典的特殊情况,并成功地对其进行了按值降序排序,从而能够轻松地从数据中提取出最有价值的信息。

以上就是Python中对NumPy数组内字典进行按值降序排序的实用教程的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1374165.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月14日 13:55:01
下一篇 2025年12月14日 13:55:11

相关推荐

  • Pandas read_csv 日期时间解析深度指南

    本教程详细讲解如何使用 Pandas 的 read_csv 函数正确解析CSV文件中的日期和时间数据。重点介绍了 parse_dates 参数的灵活应用,包括解析单个日期时间列、合并多个日期/时间列,以及如何通过 dayfirst 参数解决日期格式歧义问题,确保数据被正确识别为 datetime64…

    好文分享 2025年12月14日
    000
  • 解决OpenAI API代理连接问题:官方SDK与HTTPX配置指南

    本文旨在解决用户在使用OpenAI API时因地域限制或代理配置不当导致的连接错误(如APICONNECTIONERROR和429)。我们将探讨传统HTTP请求方式的局限性,并重点介绍如何通过OpenAI官方Python SDK结合httpx库,以专业且安全的方式正确配置代理,确保API调用的稳定与…

    2025年12月14日
    000
  • Python模块类型提示与不可变配置管理实践

    本文探讨了在Python中为模块实现类型提示,特别是针对使用__getattr__和__setattr__创建的只读配置模块。文章分析了这种模式在类型推断上的局限性,并提供了三种更符合Pythonic且支持高级类型提示的替代方案:使用@property装饰器、frozen dataclass以及Py…

    2025年12月14日
    000
  • Pandas read_csv 日期时间解析深度指南:解决常见问题与优化实践

    本文深入探讨了如何使用Pandas read_csv 正确解析CSV文件中的日期和时间数据。我们将重点讲解 parse_dates 参数的灵活运用,包括解析单个日期时间列、合并多个列为单一日期时间对象,以及如何通过 dayfirst 参数处理日期格式歧义,确保数据类型准确转换为 datetime64…

    2025年12月14日
    000
  • Cookiecutter 项目中 README.md 文件的动态更新策略

    本文探讨了如何在 Cookiecutter 项目中,根据用户选择的特性动态更新 README.md 文件内容。核心策略是利用 Jinja 模板引擎的条件逻辑直接在 README.md 模板中控制内容的显示,而非通过 post_gen_project.py 脚本进行后处理。这种方法更简洁、高效,并避免…

    2025年12月14日
    000
  • Django对象与字典列表的高效筛选与比对策略

    本文旨在探讨如何高效地比对Django QuerySet中的对象与外部字典列表之间的数据差异。我们将分析传统方法的局限性,并介绍两种基于Django ORM的优化策略:一是利用queryset.get()结合异常处理来查找字典列表中的精确匹配或缺失项;二是针对特定字段差异,通过唯一标识获取对象后进行…

    2025年12月14日
    000
  • 解析Python关键字’for’的变量命名限制

    在Python编程中,尝试将for赋值给变量会导致SyntaxError。这是因为for是Python的保留关键字,具有特定语法功能,不能被用作用户自定义的变量名。理解Python的关键字规则对于避免常见的语法错误至关重要。 Python关键字的本质 在python语言中,关键字(keywords)…

    2025年12月14日
    000
  • Python 解释器开发:变量赋值存储错误的修正教程

    本文深入探讨了在Python解释器开发中,变量赋值时错误地存储了’EQUALS’而非实际值的问题。通过分析词法分析器和语法分析器的交互,我们发现问题出在语法分析阶段,对doASSIGN函数中变量值参数的索引引用不当。教程提供了一个简洁的解决方案,即调整索引以正确获取变量的实际…

    2025年12月14日
    000
  • 从Pandas DataFrame中筛选出所有值均为非负数的对象列表

    本教程将指导您如何利用Pandas库,从一个包含分组数据和数值的DataFrame中,高效地筛选出并列出所有其关联数值均为非负数的对象。核心方法是结合使用groupby()和all()函数,对每个对象的数值进行条件判断,确保所有值都满足指定条件。 在数据分析工作中,我们经常需要根据某些条件从大型数据…

    2025年12月14日
    000
  • Docker容器中Python依赖的持久化安装策略:以Pillow为例

    本文旨在解决Docker容器中Python包安装不持久化的问题。当用户尝试在运行中的容器内安装依赖(如Pillow)后,通过docker-compose up重启服务时,这些更改会丢失。核心原因是Docker容器的瞬态特性及其基于Dockerfile的构建机制。正确的解决方案是,将所有必要的Pyth…

    2025年12月14日
    000
  • 如何从DataFrame中筛选出所有值均满足特定条件的组

    本教程详细介绍了如何使用Pandas库从DataFrame中高效筛选出所有关联值均满足特定条件(例如,所有值均非负)的项目列表。文章通过一个具体示例,演示了如何结合使用groupby()和all()方法来实现这一目标,并提供了清晰的代码示例和注意事项,帮助读者掌握数据筛选技巧。 在数据分析工作中,我…

    2025年12月14日
    000
  • Pandas DataFrame:高效筛选所有值均为非负数的组并生成列表

    本教程详细介绍了如何使用Pandas DataFrame的groupby().all()方法,高效地从数据集中筛选出所有关联值均满足特定条件(如非负数)的组,并将其名称整理成列表。通过实例代码,演示了从数据分组到条件判断再到结果提取的完整流程,帮助用户精准定位符合要求的特定数据子集。 在数据分析中,…

    2025年12月14日
    000
  • Python Selenium:正确加载Chrome指定用户配置文件的指南

    本教程详细阐述了如何使用Python Selenium正确加载Chrome浏览器的指定用户配置文件。针对常见的user-data-dir参数使用误区,文章提供了两种解决方案,重点推荐通过分离user-data-dir(指向用户数据根目录)和profile-directory(指定配置文件名称)来确保…

    2025年12月14日
    000
  • Python模块级动态属性的类型提示与更优实践

    本文探讨了如何在Python中为动态生成的模块级属性提供类型提示,并指出使用__getattr__实现此功能所面临的挑战。文章推荐了三种更符合Pythonic且支持良好类型提示的替代方案:利用类中的@property装饰器、使用frozen dataclass构建不可变数据结构,以及借助Pydant…

    2025年12月14日
    000
  • Pandas read_csv 日期时间解析:常见问题与解决方案

    本文详细探讨了在使用 Pandas read_csv 函数时,如何正确解析和合并 CSV 文件中的日期和时间列。通过示例代码,我们展示了如何利用 parse_dates 参数将单个或多个列转换为 datetime64[ns] 类型,并介绍了 dayfirst 参数在处理日期格式歧义时的重要性,旨在帮…

    2025年12月14日
    000
  • Docker环境下Flask应用访问SQLite数据库文件路径错误解决方案

    本文旨在解决Docker化Flask应用中常见的sqlite3.OperationalError: unable to open database file错误。该问题通常源于容器内部文件路径的误解或数据持久化配置不当。文章将详细分析错误成因,并提供两种主要解决方案:首先是修正容器内部的数据库文件路…

    2025年12月14日
    000
  • 正确使用argparse模块获取命令行参数的教程

    本教程详细阐述了如何使用Python的argparse模块正确解析和获取命令行参数。我们将演示如何初始化解析器、添加参数,并从解析结果中访问这些参数,确保程序能够有效地处理外部输入,避免常见的参数获取错误,从而构建健壮的命令行工具。 理解argparse模块的基础 在python中,argparse…

    2025年12月14日
    000
  • Python argparse 参数解析与主函数访问指南

    本文旨在指导读者如何使用 Python 的 argparse 模块正确解析命令行参数,并确保这些参数能被程序的 main 函数或其他核心逻辑有效访问。文章将分析常见错误,并提供两种推荐的解决方案:一种适用于简洁脚本的直接处理方式,以及一种更符合模块化设计原则的参数传递方法,以提升代码的可读性和可维护…

    2025年12月14日
    000
  • 优化Python模块的类型提示:替代__getattr__的方法

    本文旨在探讨在Python中为动态模块属性(如通过__getattr__实现)提供有效类型提示的挑战,并提供多种更具可维护性和类型安全性的替代方案。我们将深入介绍如何利用@property装饰器、dataclasses的frozen参数以及Pydantic库来构建可读、类型明确且不可变的配置管理机制…

    2025年12月14日
    000
  • Python模块级只读配置的类型提示与结构化管理

    本文探讨了如何在Python中为模块级别的只读配置提供准确的类型提示。针对传统__getattr__方式难以类型检查的问题,文章推荐采用更结构化的类方法。通过介绍@property装饰器、frozen dataclass以及Pydantic模型,详细阐述了如何构建可类型提示、不可变的配置对象,从而提…

    2025年12月14日
    000

发表回复

登录后才能评论
关注微信