Python中Collection的使用小技巧


Posted in Python onAugust 18, 2014

本文所述实例来自独立软件开发者 Alex Marandon,在他的博客中曾介绍了数个关于 Python Collection 的实用小技巧,在此与大家分享。供大家学习借鉴之用。具体如下:

1.判断一个 list 是否为空

传统的方式:

if len(mylist):
  # Do something with my list
else:
  # The list is empty

由于一个空 list 本身等同于 False,所以可以直接:

if mylist:
  # Do something with my list
else:
  # The list is empty

2.遍历 list 的同时获取索引

传统的方式:

i = 0
for element in mylist:
  # Do something with i and element
  i += 1

这样更简洁些:

for i, element in enumerate(mylist):
  # Do something with i and element
  pass

3.list 排序

在包含某元素的列表中依据某个属性排序是一个很常见的操作。例如这里我们先创建一个包含 person 的 list:

class Person(object):
  def __init__(self, age):
    self.age = age
 
persons = [Person(age) for age in (14, 78, 42)]

传统的方式是:

def get_sort_key(element):
  return element.age
 
for element in sorted(persons, key=get_sort_key):
  print "Age:", element.age

更加简洁、可读性更好的方法是使用 Python 标准库中的 operator 模块:

from operator import attrgetter
 
for element in sorted(persons, key=attrgetter('age')):
  print "Age:", element.age

attrgetter 方法优先返回读取的属性值作为参数传递给 sorted 方法。operator 模块还包括 itemgetter 和 methodcaller 方法,作用如其字面含义。

4.在 Dictionary 中元素分组

和上面类似,先创建 Persons:

class Person(object):
  def __init__(self, age):
    self.age = age
 
persons = [Person(age) for age in (78, 14, 78, 42, 14)]

如果现在我们要按照年龄分组的话,一种方法是使用 in 操作符:

persons_by_age = {}
 
for person in persons:
  age = person.age
  if age in persons_by_age:
    persons_by_age[age].append(person)
  else:
    persons_by_age[age] = [person]
 
assert len(persons_by_age[78]) == 2

相比较之下,使用 collections 模块中 defaultdict 方法的途径可读性更好:

from collections import defaultdict
 
persons_by_age = defaultdict(list)
 
for person in persons:
  persons_by_age[person.age].append(person)

defaultdict 将会利用接受的参数为每个不存在的 key 创建对应的值,这里我们传递的是 list,所以它将为每个 key 创建一个 list 类型的值。

本文示例仅为程序框架,具体功能还需要读者根据自身应用环境加以完善。希望本文所述实例对大家学习Python能起到一定的帮助作用。

Python 相关文章推荐
python 3.5下xadmin的使用及修复源码bug
May 10 Python
Python数字图像处理之霍夫线变换实现详解
Jan 12 Python
numpy.delete删除一列或多列的方法
Apr 03 Python
解决Python print 输出文本显示 gbk 编码错误问题
Jul 13 Python
Python爬虫之正则表达式的使用教程详解
Oct 25 Python
详解重置Django migration的常见方式
Feb 15 Python
Python2 Selenium元素定位的实现(8种)
Feb 25 Python
python暴力解压rar加密文件过程详解
Jul 05 Python
Python基于OpenCV实现人脸检测并保存
Jul 23 Python
tensorflow实现在函数中用tf.Print输出中间值
Jan 21 Python
使用python采集Excel表中某一格数据
May 14 Python
Pytest单元测试框架如何实现参数化
Sep 05 Python
Python实现3行代码解简单的一元一次方程
Aug 18 #Python
Python统计列表中的重复项出现的次数的方法
Aug 18 #Python
Python中无限元素列表的实现方法
Aug 18 #Python
Python中实现字符串类型与字典类型相互转换的方法
Aug 18 #Python
Python命名空间详解
Aug 18 #Python
Python判断变量是否已经定义的方法
Aug 18 #Python
Python实现全角半角转换的方法
Aug 18 #Python
You might like
星际争霸任务指南——神族
2020/03/04 星际争霸
php中修改浏览器的User-Agent来伪装你的浏览器和操作系统
2011/07/29 PHP
php计数排序算法的实现代码(附四个实例代码)
2020/03/31 PHP
PHP7 list() 函数修改
2021/03/09 PHP
传智播客学习之java 反射
2009/11/22 Javascript
学习JavaScript的最佳方法分享
2011/10/21 Javascript
为什么要在引入的css或者js文件后面加参数的详细讲解
2013/05/03 Javascript
iframe父页面获取子页面参数的方法
2014/02/21 Javascript
jquery实现简单的遮罩层
2016/01/08 Javascript
jQuery多文件异步上传带进度条实例代码
2016/08/16 Javascript
微信小程序之绑定点击事件实例详解
2017/07/07 Javascript
详解开发react应用最好用的脚手架 create-react-app
2018/04/24 Javascript
vue中的$emit 与$on父子组件与兄弟组件的之间通信方式
2018/05/13 Javascript
Vue加载组件、动态加载组件的几种方式
2018/08/31 Javascript
浅谈小程序 setData学问多
2019/02/20 Javascript
vue实现淘宝购物车功能
2020/04/20 Javascript
Vue 禁用浏览器的前进后退操作
2020/09/04 Javascript
[01:01:43]EG vs VP 2018国际邀请赛淘汰赛BO3 第二场 8.24
2018/08/25 DOTA
Django项目开发中cookies和session的常用操作分析
2018/07/03 Python
python网络编程之多线程同时接受和发送
2019/09/03 Python
keras 如何保存最佳的训练模型
2020/05/25 Python
python+requests接口自动化框架的实现
2020/08/31 Python
CSS3制作文字半透明倒影效果的两种实现方式
2014/08/08 HTML / CSS
Farah官方网站:男士服装及配件
2019/11/01 全球购物
如果NULL定义成#define NULL((char *)0)难道不就可以向函数传入不加转换的NULL了吗
2012/02/15 面试题
金蝶的一道SQL笔试题
2012/12/18 面试题
环保倡议书100字
2014/05/15 职场文书
和谐社区口号
2014/06/19 职场文书
合作协议书范文
2014/08/20 职场文书
2014个人年终工作总结范文
2014/12/15 职场文书
总经理助理岗位职责
2015/01/31 职场文书
小学感恩节活动总结
2015/03/24 职场文书
小区保洁员岗位职责
2015/04/10 职场文书
详解python中[-1]、[:-1]、[::-1]、[n::-1]使用方法
2021/04/25 Python
Pytorch可视化的几种实现方法
2021/06/10 Python
Java新手教程之ArrayList的基本使用
2021/06/20 Java/Android