第十一章:多维列表

学习目标

  1. 描述为什么列表在程序设计中很有用
  2. 学习如何创建列表
  3. 探究列表的常用操作
  4. 对列表使用len,min,max,sum和random.shuffle 函数
  5. 使用下标变量访问列表元素
  6. 使用截断运算符[start,end]
  7. 在列表中使用 +(联结) *(重复)和in、not in 操作
  8. 使用for循环遍历一个列表中的元素
  9. 使用比较运算符来比较两个列表中的内容
  10. 调用跌表的append,count,extend,index,insert,pop,remove,reverse和sort
  11. 使用str的split方法将一个字符串分为一个列表
  12. 从控制台中读取数据到列表
  13. 在应用程序中使用列表
  14. 将一个列表的内容复制到另外一个列表
  15. 开发和调用包含列表参数并返回列表的函数
  16. 使用线性查找算法或者二分查找算法来查找元素
  17. 使用选择排序法对列表进行排序
  18. 使用插入排序法对列表进行排序
  19. 使用列表开发一个弹球动画

列表

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]  # 列表元素可以是不同类型的
  1. [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8ufThAlG-1617963838037)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210408163616892.png)]

对字符串的操作和对序列的操作同样适用

  1. 列表使用的函数

    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的
    
  2. 列表方法

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(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 之后成为降序
    
  3. 将字符串分成列表

    items = "i am mooncake".split() # item ['i', 'am', 'mooncake']
    items = "09/20/2012".split(/)  # items['09','20','2012']
    
  4. 输入列表

    #一行输入一个值
    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的值
    
  5. 对列表移位

    def shift(lst):
        tmp = lst[0]
        for i in range(1,len(lst)):
            lst[i-1] = lst[i]
            
        lst[len[lst]-1] = tmp
    
  6. 简化代码

    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))

对列表进行排序

  1. 选择排序

    # -*- 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)
    
    
    
  2. 插入排序

    # -*- 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()


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值