学习目标
- 描述为什么列表在程序设计中很有用
- 学习如何创建列表
- 探究列表的常用操作
- 对列表使用len,min,max,sum和random.shuffle 函数
- 使用下标变量访问列表元素
- 使用截断运算符[start,end]
- 在列表中使用 +(联结) *(重复)和in、not in 操作
- 使用for循环遍历一个列表中的元素
- 使用比较运算符来比较两个列表中的内容
- 调用跌表的append,count,extend,index,insert,pop,remove,reverse和sort
- 使用str的split方法将一个字符串分为一个列表
- 从控制台中读取数据到列表
- 在应用程序中使用列表
- 将一个列表的内容复制到另外一个列表
- 开发和调用包含列表参数并返回列表的函数
- 使用线性查找算法或者二分查找算法来查找元素
- 使用选择排序法对列表进行排序
- 使用插入排序法对列表进行排序
- 使用列表开发一个弹球动画
列表
number_of_elements = 5
numbers = []
sum = 0
for i in range(number_of+elements):
value = eval(input("enter a new number"))
numbers.append(value)
sum += value
average = sum / number_of_elements
count = 0 # the number of elements above average
for i in range(number_of_elements):
if numbers[i] > average:
count += 1
print("average is", average)
print("number_of_elements is ", count)
列表基础
list1 = list()
list2 = list([2,3,4])
list3 = list(["red", "yellow", "green", "blue"])
list4 = list(range(3,6))
list5 = list("abcd")
list1 = []
list2 = [2,3,4]
list3 = ["red", "green"]
list4 = [2, "three", 4] # 列表元素可以是不同类型的
- [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8ufThAlG-1617963838037)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210408163616892.png)]
对字符串的操作和对序列的操作同样适用
-
列表使用的函数
import random list1 = [1,2,3,4,5] random.shuffle(list1) #shuffle the elements list1
for u in list1: print(u)
list1 = [x for x in range(5)] ## same as [0,1,2,3,4] list1 list2 =[0.5*x for x in range(5)] list2 list3 = [x for x in list2 if x < 1.5] # 取出在list2中,并且数值小于1.5的
-
列表方法
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NKOgXQmL-1617963838039)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210408170320729.png)]
list1=[x in range(5)] list1.append(5) list2=[9,55] list1.extend(list2) list1.insert(1,100) #在第一个位置插入100这个元素 list1.pop(i) # i 默认为 删除列表的最后一个元素,i可以任意指定index remove(32) #remove number 32的第一次出现的值 list1.sort() #升序排序 list1.reverse() #reverse 之后成为降序
-
将字符串分成列表
items = "i am mooncake".split() # item ['i', 'am', 'mooncake'] items = "09/20/2012".split(/) # items['09','20','2012']
-
输入列表
#一行输入一个值 lst1 = [] print("enter 10 numbers:") for i in range(10): lst1.append(eval(input())) # 一行输入所有的值 s = input("enter 10 numbers separated by spaces from one line:") items = s.split() lst =[eval(x) for x in items] #把字符串的值转化为eval的值
-
对列表移位
def shift(lst): tmp = lst[0] for i in range(1,len(lst)): lst[i-1] = lst[i] lst[len[lst]-1] = tmp
-
简化代码
def numberToMonth(number): month = ["jan", "feb", "mar", "apr", 'may', 'jun', 'jul','sep','oct','nov','dec'] return month[number-1]
实例研究:一副扑克牌
# -*- coding:utf-8 -*-
"""
作者:Administrator
日期:2021年04月08日22:35
"""
# 0-12 13-25 26-38 39-51 代表13个黑桃,13个红桃,13个方块,和13个梅花
import random
def deckOfCards():
deck = list(range(52)) # deck = [x for x in range(52)]
suitsString = "spades hearts diamonds clubs"
suits = suitsString.split()
print(suits)
ranks = ["Ace", "2", '3', '4', '5', '6', '7', '8', '9', '10', 'Jack', 'Queen', 'King']
# shuffle cards
random.shuffle(deck)
for i in range(4):
suit = suits[deck[i] // 13]
rank = ranks[deck[i] % 13]
print("Card Number", deck[i], "is the", rank, "of", suit)
deckOfCards()
复制列表
list1 = [1,2,3,4]
list2 = [8]
id(list1)
id(list2) # id 不相同,所以list1 和 list2在开始之前不是同一个列表
list2=list1 #将list2 指向list1 的内存空间,所以list1和list2是同一个id,也就是指向同一个内存空 #间了,所以会导致list2原本指向的空间列表[8]为garbage,python自动回收garbage,并 #为编译器重新使用
# 所以不推荐使用list2 = list1 这种复制列表的方法
list2 = []+list1
list2 =[x for x in list1] # 这两种是推荐的方法
将列表作为参数进行传参
因为列表是可变参数,所以在作为函数的参数进行传参的时候,list是可以发生改变的
不可变参数为 数值和字符串
def main():
x = 1
y = [1,2,3]
m(x,y)
print("x is",x)
print("y[0] is",y[0])
def m(x,y):
x=22222
y[0]=111111
main()
将列表作为一个默认参数
def add(x,lst=[]):
if x not in lst:
lst.append(x)
return lst
def main():
lst1 = add(1)
print(lst1)
lst2 = add(2)
print(lst2)
lst3 = add(3,[11,12,13,14])
print(lst3)
lst4 = add(4)
print(lst4)
main()
# output
# [1]
# [1,2] ### add 函数第二个不传参,就默认在lst1后面增加
# [11,12,13,14,3]
# [1,2,4] ## 在lst1后面增加
上面的实例是说明每次add调用同一个默认的列表;所以每次add都在同一个默认列表之后进行相加
下面这个实例说明add每次调用不同的默认列表,add的第二个参数如果没传参,就新建一个列表
def add(x,lst = None):
if lst == None:
lst = []
if x not in lst:
lst.append(x)
return lst
def main():
lst1 = add(1)
print(lst1)
lst2 = add(2)
print(lst2)
lst3 = add(111,[11,22,33])
print(lst3)
lst4 = add(4)
print(lst4)
main()
# output
# [1]
# [2]
# [11,22,33,111]
# [4] ####每次不传lst给add函数的时候,会在add函数里默认一个lst,但是在add内部判断是不是None, #是的话新建lst
从函数中返回一个列表
def reverse(lst):
result = []
for element in lst:
result.insert(element)
return result
统计每个字母出现的次数
chars = 99 * []
对列表进行二分查找
# -*- coding:utf-8 -*-
"""
作者:Administrator
日期:2021年04月09日15:17
"""
def binarySearch(lst,key):
low = 0
high = len(lst) - 1
while low <= high:
mid = (low + high) // 2
if key < lst[mid]:
high = mid - 1
elif key > lst[mid]:
low = mid + 1
else:
return mid
return -1
lst = [9,8,7,6,1,2,3,4,5]
lst.sort()
print(binarySearch(lst, 9))
对列表进行排序
-
选择排序
# -*- coding:utf-8 -*- """ 作者:Administrator 日期:2021年04月09日15:39 """ # 每次选择一个最小的元素放到开头 def selectionSort(lst): for i in range(len(lst) - 1): currentMin = lst[i] currentMinIndex = i for j in range(i+1, len(lst)): if lst[j] < currentMin: currentMin = lst[j] currentMinIndex = j if i is not currentMinIndex: lst[currentMinIndex] = lst[i] lst[i] = currentMin lst = [10, 100, 9, 8, 7, 6, 5, 4, 3, 2, 1] selectionSort(lst) print(lst)
-
插入排序
# -*- coding:utf-8 -*- """ 作者:Administrator 日期:2021年04月09日15:48 """ def insertSort(lst): for i in range(1, len(lst)): currentElement = lst[i] k = i-1 while k >= 0 and lst[k] > currentElement: lst[k+1] = lst[k] k -= 1 lst[k+1] = currentElement lst = [-1,10, 100, 9, 8, 7, 6, 5, 4, 3, 2, 1] insertSort(lst) print(lst)
实例学习:弹球
# -*- coding:utf-8 -*-
"""
作者:Administrator
日期:2021年04月09日16:09
"""
from tkinter import *
from random import randint
def getRandomColor():
color = '#'
for j in range(6):
color += toHexChar(randint(0, 15))
return color
def toHexChar(x):
if x >= 0 and x <= 9:
return str(x + ord('0'))
else:
return str(x - 10 + ord('A'))
class Ball:
def __init__(self):
self.x = 0 #starting center position
self.y = 0
self.dx = 2
self.dy = 2
self.radius = 3
self.color = getRandomColor()
class BounceBalls:
def __init__(self):
self.ballList = []
window = Tk()
window.title("BounceBallGame")
self.width = 350
self.height = 150
self.canvas = Canvas(window, bg="white", width=self.width, height=self.height)
self.canvas.pack()
frame = Frame(window)
frame.pack()
btStop = Button(frame, text="stop", command=self.stop)
btStop.pack(side=LEFT)
btResume = Button(frame, text="resume", command=self.resume)
btResume.pack(side=LEFT)
btAdd = Button(frame, text="+", command=self.add)
btAdd.pack(side=LEFT)
btRemove = Button(frame, text='-', command=self.remove)
btRemove.pack(side=LEFT)
self.sleepTime = 100
self.isStopped = False
self.animate()
window.mainloop()
def stop(self):
self.isStopped = 1
def add(self):
self.ballList.append(Ball())
def remove(self):
self.ballList.pop()
def resume(self):
self.isStopped = False
self.animate()
def animate(self):
while not self.isStopped:
self.canvas.after(self.sleepTime)
self.canvas.update()
self.canvas.delete("ball")
for ball in self.ballList:
self.redisplayBall(ball)
def redisplayBall(self,ball):
if ball.x > self.width or ball.x < 0 :
ball.dx = -ball.dx
if ball.y > self.height or ball.y < 0:
ball.dy = -ball.dy
ball.x += ball.dx
ball.y += ball.dy
self.canvas.create_oval(ball.x-ball.radius, ball.y-ball.radius, ball.x+ball.radius, ball.y+ball.radius,\
fill=ball.color, tags="ball")
BounceBalls()