python小练习-列表、字典
1、 切片(Slice)
L=['a','b','c','d']
L[0:2]表示从索引0
开始取,直到索引2
为止,但不包括索引2
。即索引0
,1,
正好是2个元素
如果第一个索引是0
,还可以省略:
L[:2]
L[-1]
取倒数第一个元素
L[:]表示从第一个到最后一个,即原样复制一个list
L[::2]去全部数据,但是每两个取一个
字符串逆序:
str = “abcdefg”
str1 = str[::-1] # “gfedcba”
#1、去字符串两边的空格
- #1、去字符串2边的空格
- def trim(s):
- if s=="":
- return s
- while(s[0]==" "):
- s = s[1:]
- if s == "":
- return s
- while(s[-1]==" "):
- s = s[:-1]
- if s == "":
- return s
- return s
- if __name__ == '__main__':
- # 1、测试:
- if trim('hello ') != 'hello':
- print('测试失败!')
- elif trim(' hello') != 'hello':
- print('测试失败!')
- elif trim(' hello ') != 'hello':
- print('测试失败!')
- elif trim(' hello world ') != 'hello world':
- print('测试失败!')
- elif trim('') != '':
- print('测试失败!')
- elif trim(' ') != '':
- print('测试失败!')
- else:
- print('测试成功!')
2、迭代
如果给定一个list或tuple,我们可以通过for
循环来遍历这个list或tuple,这种遍历我们称为迭代(Iteration),迭代是通过for ... in
来完成的
d = {'a':1,'b':2,'c':3,'d':4}
for key in d:
print(key)
for value in d.values():
print(value )
for k ,v in d.items():
print(k,v)
Python内置的enumerate
函数可以把一个list变成索引-元素对,这样就可以在for
循环中同时迭代索引和元素本身:
for i ,value in enumerate(['a','b','c','d']):
print(i,value)
#2、请使用迭代查找一个list中最小和最大值,并返回一个tuple:
- def findMinAndMax(L):
- if len(L) == 0:
- return (None, None)
- max = L[0]
- min = L[0]
- for num in L:
- if num > max:
- max = num
- if num < min:
- min = num
- return(min,max)
- # 测试
- if findMinAndMax([]) != (None, None):
- print('测试失败!')
- elif findMinAndMax([7]) != (7, 7):
- print('测试失败!')
- elif findMinAndMax([7, 1]) != (1, 7):
- print('测试失败!')
- elif findMinAndMax([7, 1, 3, 9, 5]) != (1, 9):
- print('测试失败!')
- else:
- print('测试成功!')
3、列表生成式
列表生成式即List Comprehensions,是Python内置的非常简单却强大的可以用来创建list的生成式。
举个例子,要生成list [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
可以用list(range(1, 11))
:
如果要生成[1x1, 2x2, 3x3, ..., 10x10]:
方法一:循环法:
L = []
for x in range(1,11):
L.append(x*x)
方法二:列表生成式
L = [x * x for x in range(1,11)]
写列表生成式时,把要生成的元素x * x
放到前面,后面跟for
循环,就可以把list创建出来
for循环后面还可以加上if判断
L = [x * x for x in range(1,11) if x % 2 == 0]
还可以使用两层循环,可以生成全排列:
[a * b for a in [1,2,3] for b in [4,5,6]]
最后把一个list中所有的字符串变成小写:
L=["alice","JACk","Steven","Catherine"]
[s.lower() for s in L]
# list中既包含字符串,又包含整数
- def listgenerate():
- L1 = ['Hello', 'World', 18, 'Apple', None]
- L2 = [s.lower() for s in L1 if isinstance(s, str)]
- # 测试:
- print(L2)
- if L2 == ['hello', 'world', 'apple']:
- print('测试通过!')
- else:
- print('测试失败!')
4、生成器
通过列表生成式,我们可以直接创建一个列表。但是,受到内存限制,列表容量肯定是有限的。而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。
所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间。在Python中,这种一边循环一边计算的机制,称为生成器:generator。
要创建一个generator,有很多种方法。第一种方法很简单,只要把一个列表生成式的[]
改成()
,就创建了一个generator:
L = [x * x for x in range(10)]
g = (x * x for x in range(10))
创建L
和g
的区别仅在于最外层的[]
和()
,L
是一个list,而g
是一个generator。
通过next()
函数获得generator的下一个返回值:next(g)
generator非常强大。如果推算的算法比较复杂,用类似列表生成式的for
循环无法实现的时候,还可以用函数来实现
比如,著名的斐波拉契数列(Fibonacci),除第一个和第二个数外,任意一个数都可由前两个数相加得到:
- def fib(max):
- n, a, b = 0, 0, 1
- while n < max:
- print(b)#将
print(b)
改为yield b,就可以变成生成器
- a, b = b, a + b
- n = n + 1
- return 'done'
这就是定义generator的另一种方法。如果一个函数定义中包含yield
关键字,那么这个函数就不再是一个普通函数,而是一个generator:
这里,最难理解的就是generator和函数的执行流程不一样。函数是顺序执行,遇到return
语句或者最后一行函数语句就返回。而变成generator的函数,在每次调用next()
的时候执行,遇到yield
语句返回,再次执行时从上次返回的yield
语句处继续执行。
#输出杨辉三角
- '''
- 杨辉三角定义如下:
- 1
- / \
- 1 1
- / \ / \
- 1 2 1
- / \ / \ / \
- 1 3 3 1
- / \ / \ / \ / \
- 1 4 6 4 1
- / \ / \ / \ / \ / \
- 1 5 10 10 5 1
- 把每一行看做一个list,试写一个generator,不断输出下一行的list:
- '''
- def triangles():
- L = [1]
- n = 1
- while True:
- print(L)
- if n>5:
- break
- S = L[:]
- S.append(0)#重点在于此,实现错位相加
- L = [S[i-1] + S[i] for i in range(len(S))]
- n += 1
5、map()
函数接收两个参数,一个是函数,一个是Iterable
,map
将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator
返回。
- def func(x):
- return x * x
- i = map(func, [1, 2, 3, 4, 5, 6, 7, 8, 9])
- print(list(i))
Iterator
是惰性序列,因此通过list()
函数让它把整个序列都计算出来并返回一个list
6、reduce
把一个函数作用在一个序列[x1, x2, x3, ...]
上,这个函数必须接收两个参数,reduce
把结果继续和序列的下一个元素做累积计算,其效果就是:
reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)
- #比方说对一个序列求和,就可以用reduce实现
- from functools import reduce
- def add(x, y):
- return x+y
- reduce(add,[1,2,3,4,5,6,7,8,9])
- #序列[1, 2, 3, 4, 5]变换成整数12345
- from functools import reduce
- def fn(x, y):
- return x * 10 + y
- reduce(fn,[1,2,3,4,5])
- #将字符串转换为整数
- from functools import reduce
- dic = {'': 0, '': 1, '': 2, '': 3, '': 4, '': 5, '': 6, '': 7, '': 8, '': 9}
- def char2num(ch):
- return dic [ch]
- def str2int(s):
- return reduce(lambda x, y: x * 10 + y, map(char2num, s))
- #1、利用map()函数,把用户输入的不规范的英文名字,变为首字母大写,其他小写的规范名字
- def normalize(name):
- s = ""
- for k,v in enumerate(name):
- if k ==0 :
- s += (v.upper())
- else:
- s += (v.lower())
- return s
- # 测试:
- L1 = ['adam', 'LISA', 'barT']
- L2 = list(map(normalize, L1))
- print(L2)
- '''
- 2、Python提供的sum()函数可以接受一个list并求和,
- 请编写一个prod()函数,可以接受一个list并利用reduce()求积:
- '''
- from functools import reduce
- def prod(L):
- def mul(a,b):
- return(a*b)
- return reduce(mul,L)
- print('3 * 5 * 7 * 9 =', prod([3, 5, 7, 9]))
- if prod([3, 5, 7, 9]) == 945:
- print('测试成功!')
- else:
- print('测试失败!')
- '''
- 3、利用map和reduce编写一个str2float函数,
- 把字符串'123.456'转换成浮点数123.456:
- '''
- DIGITS = {'': 0, '': 1, '': 2, '': 3, '': 4, '': 5, '': 6, '': 7, '': 8, '': 9}
- def str2float(s):
- a, b = s.split('.') #把字符串拆分成a,b两部分
- return str2int(a) + str2int(b)/10**len(b)
- def str2int(s):
- digits = {'':0, '':1, '':2, '':3, '':4, '':5, '':6, '':7, '':8, '':9}
- digit_array = map(lambda x: digits[x], s)
- return reduce(lambda x, y: x*10 + y, digit_array)
- def char2num(s):
- return map(DIGITS[s],s)
- print('str2float(\'123.456\') =', str2float('123.456'))
- if abs(str2float('123.456') - 123.456) < 0.00001:
- print('测试成功!')
- else:
- print('测试失败!')
python小练习-列表、字典的更多相关文章
- python之字符串,列表,字典,元组,集合内置方法总结
目录 数字类型的内置方法 整型/浮点型 字符串类型的内置方法 列表的内置方法 字典的内置方法 元组的内置方法 集合类型内置方法 布尔类型 数据类型总结 数字类型的内置方法 整型/浮点型 加 + 减 - ...
- Python基础2 列表 字典 集合
本节内容 列表.元组操作 字符串操作 字典操作 集合操作 文件操作 字符编码与转码 1. 列表.元组操作 列表是我们最以后最常用的数据类型之一,通过列表可以对数据实现最方便的存储.修改等操作 定义列表 ...
- 【python小随笔】字典的使用
字典也是 Python 提供的一种常用的数据结构,它用于存放具有映射关系的数据. 比如有份成绩表数据,语文:79,数学:80,英语:92,这组数据看上去像两个列表,但这两个列表的元素之间有一定的关联关 ...
- 第二周Python笔记 数据类型 列表 字典
列表,拉锁式儿合并. [ [a,b] for a,b in zip(list1,list2)] #最笨的 a=[1,2,3,4,5] b=[2,3,4,5,6] d=[] for i in range ...
- python字符串/元组/列表/字典互转
#-*-coding:utf-8-*- #1.字典 dict = {'name': 'Zara', 'age': 7, 'class': 'First'} #字典转为字符串,返回:<type ' ...
- 转:python字符串/元组/列表/字典互转
#-*-coding:utf-8-*- #1.字典 dict = {'name': 'Zara', 'age': 7, 'class': 'First'} #字典转为字符串,返回:<type ...
- python 小白(无编程基础,无计算机基础)的开发之路,辅助知识6 python字符串/元组/列表/字典互转
神奇的相互转换,小白同学可以看看,很有帮助 #1.字典dict = {'name': 'Zara', 'age': 7, 'class': 'First'} #字典转为字符串,返回:<type ...
- 关于Python元祖,列表,字典,集合的比较
定义 方法 列表 可以包含不同类型的对象,可以增减元素,可以跟其他的列表结合或者把一个列表拆分,用[]来定义的 eg:aList=[123,'abc',4.56,['inner','list'], ...
- Python基础灬列表&字典生成式
列表生成式 # 求1~10偶数的平方 # 1.常规写法 a_list = [] for i in range(1, 11): if i % 2 == 0: a_list.append(i * i) p ...
随机推荐
- eclipse安装Axis2插件和简单的webservice发布
2019独角兽企业重金招聘Python工程师标准>>> Axis2与CXF是现在很主流的WebService开发框架(java6也已经支持了),项目上还都是基本上用前两种做开发,今天 ...
- 剑指offer---05---用栈实现队列
题意 给了两个栈去实现队列 分析 两个栈如下情况 1 2 4 3 这个时候就不能够把4插入到第二个弹出栈了否则弹出顺序出错. 所以这个时候就应该等第二个栈空了的时候再 ...
- 谁需要GUI?快看Linux 终端生存之道
完全在 Linux 终端中生存并不容易,但这绝对是可行的. 处理常见功能的最佳 Linux shell 应用 你是否曾想像过完完全全在 Linux 终端里生存?没有图形桌面,没有现代的 GUI 软件, ...
- System Call
内容 设计系统调用,将系统的相关信息(CPU型号.操作系统的版本号.系统中的进程等类似于Windows的任务管理器的信息)以文本形式列表显示于屏幕,并编写用户程序予以验证. 思想 系统调用是应用程序和 ...
- HTML 页面跳转的五种方法
H方法TML 页面跳转的五种方法 下面列了五个例子来详细说明,这几个例子的主要功能是:在5秒后,自动跳转到同目录下的hello.html(根据自己需要自行修改)文件.1) html的实现 <he ...
- 数据库——数据库SQL语句大全,最常用的SQL语句
检索数据 检索单个列: SELECT pname FROM product 检索多个列: SELECT pname,market_price,is_hot FROM product 检索所有列: SE ...
- VM虚拟机手动配置IP地址
1.查看虚拟机的网关 编辑-->虚拟网络编辑器 VMnet8 NAT模式-->NAT设置-->网关IP 2.设置IP地址 系统-->首选项-->网络连接 system e ...
- C#黔驴技巧之去重(Distinct)
前言 关于C#中默认的Distinct方法在什么情况下才能去重,这个就不用我再多讲,针对集合对象去重默认实现将不再满足,于是乎我们需要自定义实现来解决这个问题,接下来我们详细讲解几种常见去重方案,孰好 ...
- nginx脚本自动安装
nginx脚本自动安装 脚本功能: 自动安装nginx 自动判别系统是否安装nginx 自定义安装nginx路径 自定义安装nginx版本. #!/bin/bash #2019年10月30日16:00 ...
- FPGA学习心得汇总(手中写代码,心中有电路)
http://bbs.ednchina.com/BLOG_ARTICLE_2111172.HTM 任何的时序逻辑都可以转换为组合逻辑+D触发器来完成. FPGA内部主要三块:可编程的逻辑单元.可编程的 ...