列表是最常用的Python数据类型。列表的数据项不需要具有相同的类型。
元组与列表类似,不同之处在于元组的元素不能修改,没有append、insert这样的方法。不可变的元组有什么意义?因为元组不可变,所以代码更安全。如果可能,能用元组代替列表,就尽量用元组。
元组使用小括号(),列表使用中括号[ ]。集合使用大括号{ }。
任务1:价格选择与排序
1、阅读理解、调试以下代码,程序保存到s5A.py
2、按以下要求修改代码,程序保存到s5B.py
(1)p的元素为二元元组。将每个元组的第1个元素与第2元素互换。
(2)程序运行效果不变。
p=[(399,"R18"), (4369,"T32"), (539,"T16"),(288,"S09"), (109,"S92"), (749,"R07"), (235,"U42"), (190,"T90"), (99,"S56"), (1000,"U80"), (1760,"R72"), (4210,"U92")]
m=int(input("输入最大价格:"))
n=int(input("输入最小价格:"))
p=[x for x in p if n<=x[0]<=m]
p.sort(reverse=True)
for x in p:
print(x[1],x[0],sep="-",end=" ")
"""
(1)推导式生成列表
[ 生成元素的表达式 for 迭代变量 in 可迭代对象 if 条件 ]
除去[if 条件] 部分,其余各部分的含义以及执行顺序和for循环是完全一样的(表达式就是for循环中的循环体)。
可以这样认为,推导式只是对for循环语句的格式做了一下简单的变形,并用 [ ] 括起来。不同之处在于,列表推导式最终会将循环过程中,计算表达式得到的一系列值组成一个列表。
如果修改为:
( 生成元素的表达式 for 迭代变量 in 可迭代对象 if 条件 )
推导式生成的结果,数据类型为生成器generator,而非元组tuple。
>>>a=[x for x in range(6)]
>>>print(a)
[0, 1, 2, 3, 4, 5]
"""
a=[x for x in range(6)] 等效于:
a=[ ] #创建空列表
for x in range(6):
a.append(x) #将生成元素表达式的值,添加到列表末尾
"""
>>>b=[3*x for x in a] #生成元素表达式 为: 3*x
>>>print(b)
[0, 3, 6, 9, 12, 15]
"""
b=[3*x for x in a] 等效于:
b=[ ]
for x in a:
b.append(3*x)
"""
>>>a=["How","are","you"]
>>>b=[y for y in a if 'o' in y] #if 条件为:if 'o' in y
>>>b
['How', 'you']
"""
添加if条件语句,只迭代符合条件的元素
b=[y for y in a if 'o' in y] 等效于:
b=[ ]
for y in a:
if 'o' in y:
b.append(y)
(2)嵌套列表(教材P51)
列表可以存储任何元素,也可以存储列表,还可以存储其他序列。
若希望访问嵌套的内层序列中的元素,需要先使用索引获取内层序列,再使用索引访问内层序列中的元素。例如:
>>>p=[("R18",399),("T32",4369),("T16",539)]
>>>p[1] #列表中索引为1的元素,嵌套的元组
('T32', 4369)
>>>p[1][0] #列表中索引为1,嵌套元组索引为0的元素
'T32'
>>>p[1][1]
4369
"""①
p=[x for x in p if n<=x[1]<=m] 等效于:
t=[ ]
for x in p:
if n<=x[1]<=m:
t.append(x)
p=t
这里,生成元素的表达式x,数据类型是元组。
"""②
p=[x[0] for x in p if n<=x[1]<=m] 等效于:
t=[ ]
for x in p:
if n<=x[1]<=m:
t.append(x[0])
p=t
这里,生成元素的表达式x[0],数据类型是字符串。
"""③
p=[ (x[1],x[0]) for x in p if n<=x[1]<=m] 等效于:
t=[ ]
for x in p:
if n<=x[1]<=m:
t.append((x[1],x[0]))
p=t
这里,生成元素的表达式(x[1],x[0]),数据类型是由括号()重新组成的元组。
生成元素的表达式,修改为[x[1],x[0]],可不可以??可以。列表和元组元素的访问方式相同,都是通过索引或切片。
任务2:计算序列的平均值
下面代码的作用是:输入不少于6个的整数,删除一个最小值、一个最大值,输出余下整数的平均值。
1、理解程序的处理方法,调试并保存到s5C.py。
2、不使用sorted函数,利用max函数和min函数求解。程序保存到s5D.py。
s=input("输入用','分隔的整数序列:")
s=eval(s) #将输入的整数串转换为元组
n=len(s) #得到整数个数
if n<6:print("ERROR")
else:
s=sorted(s) #对元组s递增排序,得到列表s
s=sum(s[1:-1])/(n-2) #对s首末外的元素求和后计算平均值
print(f"{ s:.2f }") #四舍五入保留到小数点后2位输出s的值
"""
(1)len( )函数
len(object)
返回字符串、列表、元组、字典、集合等对象的长度或元素个数。
>>> s = "hello word"
>>> len(s) #计算字符串的长度
10
>>> s= ['Java','Python','PHP']
>>> len(s) #计算列表的元素个数
3
>>> t=('hello', 100, 'Python',True)
>>> len(t) #计算元组元素个数
4
>>> d={'name':'小明', 'age':21, 'addr':"北京"}
>>> len(d) #计算字典总长度(即键值对总数)
3
(2)max( )函数
max(interalbe,key)
max(arg1,arg2,...,key)
返回给定参数的最大值。只有一个参数时,参数必须为可迭代对象。
>>> max(2,14,9,11) #多个数值型参数,取最大值
14
>>> a=[2,14,9,11]
>>> max(a) #参数为列表a
14
>>> a=(2,14,9,11)
>>> max(a) #参数为元组
14
>>> a="How are you"
>>> max(a) #参数为字符串,取排序靠后者
'y'
>>> a=("000","12","34","56","78","9")
>>> max(a) #字符比较,默认逐字符比较
'9'
>>> a=("000","12","34","56","78","9")
>>> max(a,key=len)
'000' #key=len,指定按长度比较
>>> a=("000","12","34","56","78","9")
>>> max(a,key=int)
'78' #key=int,指定转化为整数后比较
(3)sum( )函数
sum(iterable[,start])
对序列(如列表、元组、集合)进行求和计算。
>>> sum(1,2,3)
TypeError #出错,参数不正确
>>> sum([1,2,3]) #列表求和
6
>>> sum((1,2,3)) #元组求和
6
>>> sum({1,2,3}) #集合求和
6
>>>sum([1,2,3],1) #1是指定相加的参数start,默认为0。和切片中的start不一样!
7
题目中,sum(s[1:-1])等效于:sum(s)-s[0]-s[-1],s[0]为最前面的元素,s[-1]为最后的元素。
附加练习:
根据注释将代码补充完整。
s=input("输入逗号分隔的整数串:" ) #输入一个由逗号分隔的整数串s
a=______ #将字符串分割,转换为列表a
n= ______ #得到列表的元素个数n。
b=( ______ for i in range(n) if a[i] not in a[i+1:] ) #生成无重复元素的元组b
c= ______ #对元组b递减排序,生成列表c
print(",".join(c)) #将列表c的元素,连成字符串输出
程序运行结果:
输入逗号分隔的整数串:11,22,33,22,20,22,44,55
55,44,33,22,20,11

