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将抛异常。请朋友们进一步完善。
分享到:
相关推荐
6. **好友分组**:为了实现好友分组,可以创建一个嵌套字典,外层字典的键是组名,内层字典存储该组中的好友。添加好友到分组时,更新外层字典的对应分组;删除好友时,不仅需要从好友列表中移除,还要更新分组。 7...
总结一下,Python数据分析中`GroupBy`操作通过字典或`Series`可以灵活地定义分组规则,对数据进行有效的分类和分析。这种功能对于处理大量数据并从中提取有用信息至关重要,是数据科学家和分析师的必备技能之一。在...
再来说说字典,它是Python中非常重要的数据结构,用于存储键值对。字典的灵活性使得它在数据处理和映射场景中极为有用。基本操作包括添加键值对(`dict[key] = value`)、获取值(`value = dict[key]`)、删除键值对...
在Python数据分析领域,pandas库提供了强大的数据处理和分析功能,其中包括数据的聚合与分组运算。本章主要探讨如何使用pandas的groupby方法来高效地处理数据集,进行复杂的分组操作。 首先,我们要理解`groupby`的...
4. **Series或字典**:使用Series或字典也可以定义分组键,其中Series的索引必须与DataFrame的索引匹配。 例如,如果我们有一个DataFrame,其中包含“年级”、“性别”等信息,我们可以使用这些列名作为分组键。 #...
16. 在Python中使用正则表达式可以方便地匹配字符串中的特定模式,如使用re模块匹配HTML标签内的内容时,可以通过正则表达式的分组功能来提取标签内的文本。 17. Python中的断言功能可以通过assert关键字实现,用于...
模块和包是Python代码组织的重要方式,允许将相关功能分组在一起,提高代码的可维护性和重用性。通过import语句,我们可以导入并使用其他模块中的函数和类。 面向对象编程(OOP)是Python的一大特性,包括类的定义...
Python具有丰富的库,可应用于网络开发、数据科学、机器学习、自动化脚本、网站后端开发等多种场景。它的开源特性使得全球编程社区十分活跃,提供了强大的支持和大量的资源。 教程从Python的安装开始,逐步引导学习...
3. **数据结构**: Python提供了丰富的内置数据结构,如列表(动态数组)、元组(不可变序列)、字典(键值对存储)和集合(无序唯一元素集)。了解如何操作和利用这些数据结构能提高代码的效率和可读性。 4. **控制...
Python3的循环语句中,for可以遍历任何可迭代对象,如列表、字符串或字典,而while则适用于需要满足特定条件时反复执行的场景。 4. **函数和模块**:Python3的函数可以接受默认参数、关键字参数、可变参数,以及*...
书中介绍了如何进行序列解压赋值给多个变量、保留最后N个元素、查找最大或最小的N个元素、实现优先级队列、...分组、过滤序列元素、从字典中提取子集、映射名称到序列元素、转换并计算数据以及合并多个字典或映射等技巧...
模块(module)和包(package)是Python代码组织的基本单位,它们允许将相关功能分组,提高代码的可维护性和复用性。"python2.3tut"可能讲解了如何导入和使用Python模块,以及如何创建自定义模块。 Python标准库...
1. Python基础:书中首先介绍了Python的基础语法,包括变量、数据类型(如列表、元组、字典、集合)、流程控制(如if语句、for循环、while循环)以及函数和模块的使用,这些都是进行数据分析的基础。 2. NumPy库:...
模块和包是Python组织代码的重要方式,允许将相关功能分组到单独的文件中。Python标准库提供了大量预装模块,如os、sys、math和datetime,而第三方包(如通过pip安装)则扩展了Python的功能,如Numpy用于数值计算,...
1. **Python 2.7 特性**:Python 2.7保留了2.x系列的语法特性,包括旧式的字符串表示和不强制使用括号来分组操作。它支持多种数据类型,如列表、元组、字典、集合等,并且拥有强大的内置函数,如`map()`, `filter()`...
本压缩包文件“python-leetcode面试题解之第49题字母异位词分组-题解.zip”专注于解答LeetCode上的第49题——字母异位词分组。这道题目主要涉及字符串处理、哈希表以及算法设计,是Python编程者在面试准备过程中必须...
第二次课则聚焦于Python的基础语法和内置数据结构,如列表、元组、字典和集合的运用。第三次课将教授Python函数的定义与调用,以及文件操作的基本知识,帮助学生掌握函数编程和数据存储的方法。这些基础知识为后续...
Pandas是Python数据分析的核心库,它提供了DataFrame和Series等高效的数据结构,使得数据清洗、筛选、排序和分组变得简单。例如,我们可以用Pandas轻松地处理缺失值(fillna或dropna方法)、删除重复值(duplicated...
在Python编程语言中,字典和列表是两种基本的数据结构。字典是一种键值对集合,其中键必须是唯一的,而值可以是任意类型的数据,包括列表、字典或其他复杂数据结构。列表则是一个有序集合,可以包含任意类型的元素,...
### 如何高效使用Python字典的方法详解 #### 前言 字典(dict)作为Python中最常用的数据结构之一,其重要性不言而喻。本文将深入探讨如何更高效地利用Python字典,通过一系列实用技巧帮助读者提高编程效率。 ####...