排序时程序中用得比较多的方法了。在Python中,最简单的排序方法摸过与使用内置的sorted(list)这个函数了,该函数一一个列表作为参数返回一个新的列表,只不过是把旧列表中的元素排过序了。原列表没有被改变。
a = [5, 1, 4, 3]
print sorted(a) ## [1, 3, 4, 5]
print a ## [5, 1, 4, 3]
我们最常用的酒杀给sorted函数传递一个列表,实际上它可以接受任何能迭代的集合作为参数。这里要注意list类型上的方法.sort(),它是在原列表上排序,没有返回值(正因为它不会生成一个新的列表,因此在速度上会较sorted快一点。不过你都能忍受python的速度了,这一点损耗当然就不是问题了)。相比之下,我们还是经常有sorted()方法,因为它的包容性更强大。
sorted()函数也带有一些自定义的参数,具体说明可以去看Python的官方文档(或者直接google关键字 python sorted)。这里简单的介绍下其中一个可选参数reverse,默认值为False,当为True的时候表示倒序排列.
strs = ['aa', 'BB', 'zz', 'CC']
print sorted(strs) ## ['BB', 'CC', 'aa', 'zz'] (case sensitive)
print sorted(strs, reverse=True) ## ['zz', 'aa', 'CC', 'BB']
在实际应用的过程中,为了应对更复杂的排序要求,sorted()函数接受一个可选的参数key(通常是一个function,暂且称为key function)来确定排序时需要比较的方法。这个function有一个参数,返回一个值,而且这个返回值就用作排序比较时的标准。
来看下这个例子,对一个字符串的里诶包排序,我们指定这个key function为len函数,即用字符串的长度做为标准来排序,短的排在前面。
strs = ['ccc', 'aaaa', 'd', 'bb']
print sorted(strs, key=len) ## ['d', 'bb', 'ccc', 'aaaa']
来看另一个例子,我们用str.lower()作为排序的key function,来让所有字母都先变成小写再进行排序。
## "key" argument specifying str.lower function to use for sorting
print sorted(strs, key=str.lower) ## ['aa', 'BB', 'CC', 'zz']
当然了,你也可以自己定义一恶搞函数来完成排序的功能。
## Say we have a list of strings we want to sort by the last letter of the string.
strs = ['xc', 'zb', 'yd' ,'wa'] ## Write a little function that takes a string, and returns its last letter.
## This will be the key function (takes in 1 value, returns 1 value).
def MyFn(s):
return s[-1] ## Now pass key=MyFn to sorted() to sort by the last letter:
print sorted(strs, key=MyFn) ## ['wa', 'zb', 'xc', 'yd']
当你使用key这个可选参数时,要谨记你提供的函数要接受一个参数并返回一个值来知道排序的标准。
好了,下面来说说list中一个比较屌的用法列表推导.这玩意用好了能帮你节约不少的代码量。列表推导是一种紧凑的表达式来扩展整个列表。假如我们有这样一个数字型的列表[1, 2, 3, ],我们的任务是计算每一项的平方[1, 4, 9, 16]
nums = [1, 2, 3, ]
squares = [n*n for n in nums] ##[1, 4, 9, 16]
这个语法[expr for var in list]和语法[for var in list]长的很相似,但是前者没有后面的冒号: 语法左边的expr就是计算之前的每一项来应用到新的列表之中。再来看这样一个例子
strs = ['hello', 'and', 'goodbye']
shouting = [ s.upper() + '!!!' for s in strs ]
## ['HELLO!!!', 'AND!!!', 'GOODBYE!!!']
当然,你也可以在for-in后面加上if语句来过滤你原列表的每一项(只有这样子,才能称得上强大的工具对不对)。当if判断为true时就会代入到expr中进行下一步的计算。
## Select values <= 2
nums = [2, 8, 1, 6]
small = [ n for n in nums if n <= 2 ] ## [2, 1] ## Select fruits containing 'a', change to upper case
fruits = ['apple', 'cherry', 'bannana', 'lemon']
afruits = [ s.upper() for s in fruits if 'a' in s ]
## ['APPLE', 'BANNANA']

分分钟搞定Python之排序与列表的更多相关文章

  1. 教你分分钟搞定Python之Flask框架

    用最短的时间开发一个数据操作接口,Python是王道! 一.安装pip .首先检查linux有没有安装python-pip包,终端执行 pip -V [root@ network-scripts]# ...

  2. 转载 12步轻松搞定python装饰器

    作者: TypingQuietly 原文链接: https://www.jianshu.com/p/d68c6da1587a 呵呵!作为一名教python的老师,我发现学生们基本上一开始很难搞定pyt ...

  3. Python高级特性: 12步轻松搞定Python装饰器

    12步轻松搞定Python装饰器 通过 Python 装饰器实现DRY(不重复代码)原则:  http://python.jobbole.com/84151/   基本上一开始很难搞定python的装 ...

  4. 12步轻松搞定Python装饰器

    译者:寒寻 译文:http://www.cnblogs.com/imshome/p/8327438.html 原文:https://dzone.com/articles/understanding-p ...

  5. 第12天 | 12天搞定Python,让excel飞起来

    学了10多天Python基础知识了,是时候来点硬货了,看过<第1天 | 12天搞定Python,告诉你有什么用?>的老铁都知道,Python可用的领域挺多的.只是我长期待在企业,所以只能说 ...

  6. 第1天|12天搞定Python网络爬虫,吃里爬外?

    人力资源部漂亮的小MM,跑来问我:老陈,数据分析和爬虫究竟是关系呀?说实在的,我真不想理她,因为我一直认为这个跟她的工作关系不大,可一想到她负责我负责部门的招聘工作,我只好勉为其难地跟她说:数据分析, ...

  7. 第4天 | 12天搞定Python,基础语法(下)

    为了方便你的学习,减轻负重,我特意将基础语法分成上下两部分.希望你喜欢这种方式,如果不喜欢,你可以跟我说,反正我是不会改的,哈哈~~. 如果上部分,你还没看的话,先去看<第4天 | 12天搞定P ...

  8. 第10天 | 12天搞定Python,文件操作(超详细)

    在开发系统的过程中,经常会用到XML存储和传输数据,XML是一种用于标记电子文件使其具有结构性的标记语言,在博客中经常会见到. JSON是一种轻量级的数据交换格式,常被用在后端和前端的数据交互上,如你 ...

  9. 一句话搞定python六剑客

    六剑客 一行搞定六剑客:三个函数:map filter reduce + lambda 切片 推导列表 python最有特点的一行代码,所有代码均可以借用一行代码(目标) 1.map(函数,列表或者字 ...

随机推荐

  1. caffe的特殊层

    每次写博客都带有一定的目的,在我看来这是一个记录的过程,所以尽量按照循序渐进的顺序逐步写,前面介绍的CNN层应该是非常常用的,这篇博客介绍一下某些特殊的layer,但是由于特殊的layer都带有一定的 ...

  2. Ubuntu 设置 sudo 开机自启动项 无需输入密码

    如果你想设置一个需要sudo权限执行的开机自启动项,而不需要输入密码,那么你需要把该程序加入  /etc/sudoers 中.要直线这个, 首先执行 sudo visudo ,在文件最后加入下面一行 ...

  3. Node程序debug小记

    有时候,所见并不是所得,有些包,你需要去翻他的源码才知道为什么会这样. 背景 今天调试一个程序,用到了一个很久之前的NPM包,名为formstream,用来将form表单数据转换为流的形式进行接口调用 ...

  4. windebug常用命令

    使用~查看所有线程 切换到一号线程:~1s 查看所有线程的托管堆栈  ~* e!clrstack 怎么查看,当前线程下,变量的信息? 对于托管代码而言,最核心的命令就是!do(dump object的 ...

  5. console.dir() 与 console.dirxml() 的使用

    在调试JavaScript程序时,有时需要dump某些对象的详细信息.通过手工编写JavaScript代码可以完成这一工作:针对对象的属性进行循环,将循环到的每一个属性值打印出来:可见,这一过程是比较 ...

  6. dropload的使用记录

    这次做一个H5的页面,需要用到上拉加载,下拉刷新的功能,在网上看到ximen写的dropload.js可以满足需求(此处致谢作者),但是用的时候还是踩了一些坑,这里记录下来备忘. 一些小问题:1. m ...

  7. mysql备份的 三种方式【转】

    备份的本质就是将数据集另存一个副本,但是原数据会不停的发生变化,所以利用备份只能回复到数据变化之前的数据.那变化之后的呢?所以制定一个好的备份策略很重要. 一.备份的目的 做灾难恢复:对损坏的数据进行 ...

  8. 美国部分科技公司创始及IPO信息

    作者:Ben.Z 时间:2018-04-19 做这份统计表格的目的是为了更好地了解当下美国的IT发展,搞清楚那些耳熟能详的名词的来源. 原文是用WPS统计的,本文仅展示截图. 创始人年龄分析: 1.上 ...

  9. RStdio常用快捷键

    掌握常用快捷键的使用, 可以让我们的效率加倍! 下面只列举了一些最常见的快捷键, RStdio的快捷键远不止这些, 具体的可以参照这里. 无论是在控制台还是在编辑区, Tab都可以帮助我们对代码进行补 ...

  10. volatile 学习笔记

    全面理解Java内存模型(JMM)及volatile关键字 正确使用 Volatile 变量 Java内存模型 在并发编程中,需要处理两个关键问题:线程之间如何通信及线程之间如何同步.通信是指线程之间 ...