Python从题目学习:List comprehension

九九乘法表作业其实有更简单的做法,就是用列表推导式。

-----------------------------------------------------------------------------

Print below multiplication table: 
1*1=1
1*2=2   2*2=4
1*3=3   2*3=6   3*3=9
1*4=4   2*4=8   3*4=12  4*4=16
1*5=5   2*5=10  3*5=15  4*5=20  5*5=25
1*6=6   2*6=12  3*6=18  4*6=24  5*6=30  6*6=36
1*7=7   2*7=14  3*7=21  4*7=28  5*7=35  6*7=42  7*7=49
1*8=8   2*8=16  3*8=24  4*8=32  5*8=40  6*8=48  7*8=56  8*8=64
1*9=9   2*9=18  3*9=27  4*9=36  5*9=45  6*9=54  7*9=63  8*9=72  9*9=81
--------------------------------------------------------------------------------------------

1.列表推导式书写形式:  

[表达式 for 变量 in 列表]    或者    [表达式 for 变量 in 列表 if 条件]

2.介绍:

列表推导式是利用其他列表创建新列表的一种方法,它的工作方式类似于for循环。

简单理解就是 可以直接通过for循环生成一个list列表。

3.举例:

list = [1,2,3,4,5,6,7,8,9]

#打印列表中 所有元素的平方
print [x**2 for x in list]
#[1, 4, 9, 16, 25, 36, 49, 64, 81]

#打印列表中 大于5的元素的平方 (只需要添加if语句即可)
print [x**2 for x in list if x>5]
#[36, 49, 64, 81]

#打印列表中 所有元素和元素*10组成的元祖
print [(x,x*10) for x in list]
#[(1, 10), (2, 20), (3, 30), (4, 40), (5, 50), (6, 60), (7, 70), (8, 80), (9, 90)]

#也可以在添加多个for循环
print [(x,y) for x in range(3) for y in range(3)]
[(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2)]
print [[x,y] for x in range(3) for y in range(3)]
[[0, 0], [0, 1], [0, 2], [1, 0], [1, 1], [1, 2], [2, 0], [2, 1], [2, 2]]

#当然,添加多个if循环也可以
[(x, y) for x in range(10) if x % 2 if x > 3 for y in range(10) if y > 7 if y != 8]
#[(5, 9), (7, 9), (9, 9)]
list1 = [2,4,6]
list2 = [3,6,9]
[list1[i]+list2[2] for i in range(len(list1))]
#[11, 13, 15]

4.题目做法:

>>> print "\n".join([" ".join(["%d*%d=%d"%(secondNum,firstNum,firstNum*secondNum) for secondNum in range(1,firstNum+1)]) for firstNum in range(1,10)])
#1*1=1
#1*2=2 2*2=4
#1*3=3 2*3=6 3*3=9
#1*4=4 2*4=8 3*4=12 4*4=16
#1*5=5 2*5=10 3*5=15 4*5=20 5*5=25
#1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36
#1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49
#1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64
#1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81

如果想了解list comprehension原理的东西,这个人文章写得很清楚:http://blog.chinaunix.net/uid-28631822-id-3488324.html

5.实践:

在来一道题,摘自《Python基础教程》:

>>> girls = [‘alice‘,‘bernice‘,‘clarice‘]
>>> boys = [‘chris‘,‘arnold‘,‘bob‘]
>>> [b+‘+‘+g for b in boys for g in girls if b[0]==g[0]]
[‘chris+clarice‘, ‘arnold+alice‘, ‘bob+bernice‘]
#当然这样也可以,脑子不要不转圈
>>> [(b,g) for b in boys for g in girls if b[0]==g[0]]
[(‘chris‘, ‘clarice‘), (‘arnold‘, ‘alice‘), (‘bob‘, ‘bernice‘)]

书上还提供了一种更优的方案:

>>> for girl in girls:
    letterGirls.setdefault(girl[0],[]).append(girl)
>>> [b+‘+‘+g for b in boys for g in letterGirls[b[0]]]
#[‘chris+clarice‘, ‘chris+clarice‘, ‘arnold+alice‘, ‘arnold+alice‘, ‘bob+bernice‘, ‘bob+bernice‘]

#解释一下:
#letterGirls.setdefault(girl[0],[]) 之后
>>> print letterGirls
#{‘a‘: [], ‘c‘: [], ‘b‘: []}

#letterGirls.setdefault(girl[0],[]).append(girl)之后
>>> letterGirls
{‘a‘: [‘alice‘], ‘c‘: [‘clarice‘], ‘b‘: [‘bernice‘]}

#for循环遍历字典,得到的是key值
#setdefault(key,value),如果没有value值就更新,有的话就不更新值。
时间: 2024-10-12 12:51:10

Python从题目学习:List comprehension的相关文章

【python标准库学习】thread,threading(二)多线程同步

继上一篇介绍了python的多线程和基本用法.也说到了python中多线程中的同步锁,这篇就来看看python中的多线程同步问题. 有时候很多个线程同时对一个资源进行修改,这个时候就容易发生错误,看看这个最简单的程序: import thread, time count = 0 def addCount(): global count for i in range(100000): count += 1 for i in range(10): thread.start_new_thread(ad

【python标准库学习】thread,threading(一)多线程的介绍和使用

在单个程序中我们经常用多线程来处理不同的工作,尤其是有的工作需要等,那么我们会新建一个线程去等然后执行某些操作,当做完事后线程退出被回收.当一个程序运行时,就会有一个进程被系统所创建,同时也会有一个线程运行,这个线程就是主线程main,在主线程中所创建的新的线程都是子线程,子线程通常都是做一些辅助的事.python中提供了thread和threading两个模块来支持多线程. python中使用线程有两种方式,第一种是用thread模块的start_new_thread函数,另一种是用threa

python第三方库学习之xlrd读取Excel文件

因为经常会涉及到从Excel表中导数据,所以就学习了python的xlrd来读取excel中的数据. 1.xlrd的安装 xlrd是python的第三方库,所以是需要自己安装的,可以在python的官网http://pypi.python.org/pypi/xlrd下载该模块来安装,也可以通过其他手段,比如easy_install或者pip啥的,我已经安装好pip所以就用最懒的方式来安装了pip install xlrd来安装. 2.分析excel文件的层级对象 要读取excel的数据,就要了解

python面试题目

问题一:以下的代码的输出将是什么? 说出你的答案并解释. class Parent(object): x = 1 class Child1(Parent): pass class Child2(Parent): pass print Parent.x, Child1.x, Child2.x Child1.x = 2 print Parent.x, Child1.x, Child2.x Parent.x = 3 print Parent.x, Child1.x, Child2.x 答案是 1 1

《灰帽Python-黑客和逆向工程师的Python编程》学习记录

ctypes是Python语言的一个外部库,提供和C语言兼容的数据类型,可以很方便的调用C DLL中的函数. 操作环境:CentOS6.5 Python版本:2.66 ctypes是强大的,强大到本书以后介绍的几乎所有库都要基于此.使用它我们就能够调用动态链接库中函数,同时创建各种复杂的C数据类型和底层操作函数.毫无疑问,ctypes就是本书的基础. 第一章 搭建开发环境 1.3.2 使用动态链接库 from ctypes import * libc = CDLL("libc.so.6"

从一道趣味题目学习正则表达式

前天做了陈皓的趣味竞赛题目(fun.coolshell.cn),一直卡在第四道题目回文猫处不知所以然,看了微博上的提示,知道需要用正则表达式,但是不确定使用表达式的模式和原文,下面是第四道题的截图和链接,不看解析,你可以想到通关的办法吗? 看了答案,才知道source藏在网页的html源码中,曾经有过去看源码的念头,想作者不会这么geek吧,结果...就在源码中,下面是需要搜寻的网页的源码: <!-- h8:[email protected]:V<7Q3:]iqbn58\YoLGtweZus;

python源码学习(一)——python的总体架构

python源码学习(一)——python的总体架构 学习环境: 系统:ubuntu 12.04 STLpython版本:2.7既然要学习python的源码,首先我们要在电脑上安装python并且下载python的源码,ubuntu 12.04 STL自带的python版本为2.7.3,这就可以了,接下来下载源码,下载python2.7.7的源代码,下载结束后解压文件,我们会看到如下文件结构:,接下来介绍一下,demo文件夹里放的是一些例子:Doc文件夹里放的是文档,Grammer是语法分析器,

Python结合OpenCV学习资料

原文地址:http://leihuang.net/2014/05/19/List-Interviews/ 单链表的一些常见面试题汇总 单链表反转/逆序 求单链表倒数第N个数 找到单链表的中间结点 如何判断链表是否有环的存在 单链表建环,无环链表变有环 如何知道环的长度? 如何找出环的连接点在哪里? 删除单链表中的重复元素 下面我先简单叙述一下每道题的思路,然后把实现的程序一起贴出来,不会讲得太细,我觉得只要有了思路之后,接下来的难点就是语言上的一些细节问题了,这个不自己去实现,听别人讲是体会不到

SecureCRT中python脚本编写学习指南

SecureCRT中python脚本编写学习指南 SecureCRT python 引言 在测试网络设备中,通常使用脚本对设备端进行配置和测试以及维护:对于PE设备的测试维护人员来说使用较多是SecureCRT工具:SecureCRT支持VB.JavaScript.Python等多种脚本语言,为了实现脚本在CRT中更加丰富稳定地执行,掌握CRT的常用函数是非常有用的.接下来的时间我将对SecureCRT脚本编写的常用函数展开学习应用. 内容 (1)使用python语言实现SecureCRT中的D