`

python 可分组字典

阅读更多
class Person(object):
    def __init__(self,first_name,last_name):
        self.first_name =first_name
        self.last_name = last_name

    def __repr__(self):
        return u"first name :" + unicode(self.first_name) \
            + u" ; last name :" + unicode(self.last_name)


a1 = [Person(u"liu", u"xing"), Person(u"liu", u"xu"), Person(u"zhang", u"xing")]
a2 = [Person(u"liu", u"qin"), Person(u"li", u"jun"), Person(u"zhang", u"hua")]



使用python 开发时,是不是时常有这样的需求,对一个集合的每个对象,按照某属性分类,比如
需要按照姓来分组,同姓的分在一个组内。大伙比较常见的做法如下:

    d = {}
    for per in a1:
        if per.first_name not in d:
            d[per.first_name] = []
        d[per.first_name].append(per)
    for per in a2:
        if per.first_name not in d:
            d[per.first_name] = []
        d[per.first_name].append(per

python中对dict的默认值有设置,详见python doc的dict.setdefault

    d = {}
    for per in a1:
        d.setdefault(per.first_name, []).append(per)
    for per in a2:
        d.setdefault(per.first_name, []).append(per)


python提供自动创建默认值的结构defaultdict

进一步优化,如下:
    d = defaultdict(list)
    for per in a1:
        d[per.first_name].append(per)
    for per in a2:
        d[per.first_name].append(per)

熟悉列表推导或者map方法的进一步优化:
    d = defaultdict(list)
    map(lambda per:d[per.first_name].append(per),a1)
    map(lambda per:d[per.first_name].append(per),a2)
    
    d = defaultdict(list)
    [d[per.first_name].append(per) for per in a1]
    [d[per.first_name].append(per) for per in a2]


还有进一步优化的可能吗?熟悉reduce的朋友可以看下我提供的解决方案,代码如下:
class GroupDict(defaultdict):
    
    def __init__(self, default_factory=list):
        '''
        @param default_factory: default value generator
        '''
        super(GroupDict, self).__init__(default_factory)
        default_value_type = default_factory if default_factory else list
        if issubclass(default_value_type, list) :
            self._add_function = default_value_type.append
        elif issubclass(default_value_type, set):
            self._add_function = default_value_type.add
        
    def append_2_value_collection(self, k, value):
        '''
        @param k: the key 
        @param value: the value to add to self[k] 
        @return: self 
        @attention: it's important to return self 
        '''
        self._add_function(self[k], value)
        return self

那有了这个类,和reduce配合起来就可以像使用jQuery一样链式编写代码了
    d = reduce(lambda d, per:d.append_2_value_collection(per.first_name, per), a1, GroupDict())
    reduce(lambda d, per:d.append_2_value_collection(per.first_name, per), a2 , d)

    for k,v in d.iteritems():
        print k ,u"...."
        for per in v:
            print per

输出结果和上述前几个完全一致。该结构完全继承了dict的功能,只有一个需要注意的,就是一旦使用继承下的方法修改value为非default_factory实例后,再次调用append_2_value_collection将抛异常。请朋友们进一步完善。
0
2
分享到:
评论

相关推荐

    好友管理python课程设计.7z

    6. **好友分组**:为了实现好友分组,可以创建一个嵌套字典,外层字典的键是组名,内层字典存储该组中的好友。添加好友到分组时,更新外层字典的对应分组;删除好友时,不仅需要从好友列表中移除,还要更新分组。 7...

    Python数据分析中Groupby用法之通过字典或Series进行分组的实例

    总结一下,Python数据分析中`GroupBy`操作通过字典或`Series`可以灵活地定义分组规则,对数据进行有效的分类和分析。这种功能对于处理大量数据并从中提取有用信息至关重要,是数据科学家和分析师的必备技能之一。在...

    python3实用编程技巧进阶(1套课程)\第2章2-2 3 4 PYTHON命名 统计 字典 Python课程 教程

    再来说说字典,它是Python中非常重要的数据结构,用于存储键值对。字典的灵活性使得它在数据处理和映射场景中极为有用。基本操作包括添加键值对(`dict[key] = value`)、获取值(`value = dict[key]`)、删除键值对...

    python3数据聚合与分组运算.docx

    在Python数据分析领域,pandas库提供了强大的数据处理和分析功能,其中包括数据的聚合与分组运算。本章主要探讨如何使用pandas的groupby方法来高效地处理数据集,进行复杂的分组操作。 首先,我们要理解`groupby`的...

    Python数据处理单元四 使用pandas进行数据分组与聚合.docx

    4. **Series或字典**:使用Series或字典也可以定义分组键,其中Series的索引必须与DataFrame的索引匹配。 例如,如果我们有一个DataFrame,其中包含“年级”、“性别”等信息,我们可以使用这些列名作为分组键。 #...

    python面试题汇总(

    16. 在Python中使用正则表达式可以方便地匹配字符串中的特定模式,如使用re模块匹配HTML标签内的内容时,可以通过正则表达式的分组功能来提取标签内的文本。 17. Python中的断言功能可以通过assert关键字实现,用于...

    Python语言程序设计基础源代码,python语言程序设计基础笔记,Python

    模块和包是Python代码组织的重要方式,允许将相关功能分组在一起,提高代码的可维护性和重用性。通过import语句,我们可以导入并使用其他模块中的函数和类。 面向对象编程(OOP)是Python的一大特性,包括类的定义...

    树莓派Python

    Python具有丰富的库,可应用于网络开发、数据科学、机器学习、自动化脚本、网站后端开发等多种场景。它的开源特性使得全球编程社区十分活跃,提供了强大的支持和大量的资源。 教程从Python的安装开始,逐步引导学习...

    Python 2.7 Tutorial 中文版_python_

    3. **数据结构**: Python提供了丰富的内置数据结构,如列表(动态数组)、元组(不可变序列)、字典(键值对存储)和集合(无序唯一元素集)。了解如何操作和利用这些数据结构能提高代码的效率和可读性。 4. **控制...

    《PythonCook》

    书中介绍了如何进行序列解压赋值给多个变量、保留最后N个元素、查找最大或最小的N个元素、实现优先级队列、...分组、过滤序列元素、从字典中提取子集、映射名称到序列元素、转换并计算数据以及合并多个字典或映射等技巧...

    Python 指南

    模块(module)和包(package)是Python代码组织的基本单位,它们允许将相关功能分组,提高代码的可维护性和复用性。"python2.3tut"可能讲解了如何导入和使用Python模块,以及如何创建自定义模块。 Python标准库...

    利用Python进行数据分析 原书第2版_python_数据分析_

    1. Python基础:书中首先介绍了Python的基础语法,包括变量、数据类型(如列表、元组、字典、集合)、流程控制(如if语句、for循环、while循环)以及函数和模块的使用,这些都是进行数据分析的基础。 2. NumPy库:...

    python语言学习教程

    模块和包是Python组织代码的重要方式,允许将相关功能分组到单独的文件中。Python标准库提供了大量预装模块,如os、sys、math和datetime,而第三方包(如通过pip安装)则扩展了Python的功能,如Numpy用于数值计算,...

    python-2.7.14 windows x64版本 可执行安装包

    1. **Python 2.7 特性**:Python 2.7保留了2.x系列的语法特性,包括旧式的字符串表示和不强制使用括号来分组操作。它支持多种数据类型,如列表、元组、字典、集合等,并且拥有强大的内置函数,如`map()`, `filter()`...

    python-leetcode面试题解之第49题字母异位词分组-题解.zip

    本压缩包文件“python-leetcode面试题解之第49题字母异位词分组-题解.zip”专注于解答LeetCode上的第49题——字母异位词分组。这道题目主要涉及字符串处理、哈希表以及算法设计,是Python编程者在面试准备过程中必须...

    Python数据分析与可视化-电子教案.pdf

    第二次课则聚焦于Python的基础语法和内置数据结构,如列表、元组、字典和集合的运用。第三次课将教授Python函数的定义与调用,以及文件操作的基本知识,帮助学生掌握函数编程和数据存储的方法。这些基础知识为后续...

    python数据与可视化实训总结.docx

    Pandas是Python数据分析的核心库,它提供了DataFrame和Series等高效的数据结构,使得数据清洗、筛选、排序和分组变得简单。例如,我们可以用Pandas轻松地处理缺失值(fillna或dropna方法)、删除重复值(duplicated...

    python3中文文档

    Python3的循环语句中,for可以遍历任何可迭代对象,如列表、字符串或字典,而while则适用于需要满足特定条件时反复执行的场景。 4. **函数和模块**:Python3的函数可以接受默认参数、关键字参数、可变参数,以及*...

    python 中字典嵌套列表的方法

    在Python编程语言中,字典和列表是两种基本的数据结构。字典是一种键值对集合,其中键必须是唯一的,而值可以是任意类型的数据,包括列表、字典或其他复杂数据结构。列表则是一个有序集合,可以包含任意类型的元素,...

    如何高效使用Python字典的方法详解

    ### 如何高效使用Python字典的方法详解 #### 前言 字典(dict)作为Python中最常用的数据结构之一,其重要性不言而喻。本文将深入探讨如何更高效地利用Python字典,通过一系列实用技巧帮助读者提高编程效率。 ####...

Global site tag (gtag.js) - Google Analytics