Python Chapter 10: 列表 Part3

10.10 查找列表

线性查找

线性查找顺序地将关键字key与列表中的每一个元素进行比较,直到找到某个匹配元素时返回其下标,亦或在找不到时返回-1。代码如下:

# The function for finding a key in a list
def linearSearch(lst, key):
    for i in range(len(lst)):
        if lst[i] == key:
            return i

    return -1

若关键字存在,线性查找在找到关键字前平均需要查找一半的元素,其运行时间与列表中的元素个数成正比(时间复杂度为O(n)?)。这样的效率十分低下。

二分查找

在保证关键字是升序排序的基础上,使用二分查找效率很高。其核心在于若关键字比中间的元素大,则仅在中间元素右边寻找,即更新low = mid + 1;若关键字比中间元素小,则仅在中间元素左边寻找,所以更新high = mid - 1;若关键字与中间元素一样大,则找到结果mid。不断循环,若最后有high > mid,则表示找不到关键字元素,则返回-low-1标记关键字应当被放置的位置。代码如下:

# Use binary search to find key in the list
def binarySearch(lst, key):
    low = 0
    high = len(lst) - 1

    while high >= low:
        mid = (low + high) // 2
        if key < lst[mid]:
            high = mid - 1
        elif key == lst[mid]:
            return mid
        else:
            low = mid + 1

    return -low - 1

此算法的时间复杂度为O(logn),比起线性查找高效很多,但前提是保证列表中的元素已经有序。


10.11 排序列表

选择排序

选择排序的核心思想是,在每一次循环中找列表中最小元素与当前的第一个元素交换位置,然后再对剩余列表往复此操作,从而达到使列表中元素升序排列的目的。代码如下:

# The function for sorting elements in ascending order
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 currentMinIndex != i:
            lst[currentMinIndex] = lst[i]
            lst[i] = currentMin

选择排序的平均时间复杂度为O(n2)

插入排序

插入排序的核心思想是,在每一次循环中将一个新的元素插入到已经排好序的列表中,再对剩余元素往复此操作,从而达到使列表中元素升序排列的目的。代码如下:

# The function for sorting elements in ascending order
def insertionSort(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

此算法的时间复杂度亦为O(n2),但其并不是每次都几乎遍历整个列表,因此在常数上会比选择排序略小。

排序的算法还有冒泡排序、快速排序、堆排序等等,这里仅举例实现。


10.12 实例学习:弹球

在屏幕上使一系列弹球运动,并通过按钮使增加一个弹球或减少一个弹球,弹球以列表的形式储存,代码如下:

from tkinter import *
from random import randint

def getRandomColor():
    color = "#"
    for j in range(6):
        color += toHexChar(randint(0,15))
    return color

def toHexChar(hexValue):
    if 0 <= hexValue <= 9:
        return chr(hexValue + ord(‘0‘))
    else:
        return chr(hexValue + ord(‘A‘) - 10)

class Ball:
    def __init__(self):
        self.x = 0
        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("Bouncing Balls")

        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 = True

    def resume(self):
        self.isStopped = False
        self.animate()

    def add(self):
        self.ballList.append(Ball())

    def remove(self):
        self.ballList.pop()

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


Python Chapter 10: 列表 Part3

原文地址:https://www.cnblogs.com/fsbblogs/p/9742280.html

时间: 2024-10-16 09:46:46

Python Chapter 10: 列表 Part3的相关文章

Python Special Syntax 10:列表综合,不定数参数传递(C#的params关键字)

列表综合 参见:http://woodpecker.org.cn/abyteofpython_cn/chinese/ch15s03.html #-*-coding:utf-8 def ttt(value1,*args): for i in args: value1+=i print(value1) def tt2(**args): iSum=args['a']+args['b'] print iSum ttt(10,1,2,3,4) tt2(a=3,b=4) 输出:207 Python Spec

Python无限元素列表实例教程

有关Python中无限元素列表的实现方法. 本文实例讲述了Python怎么实现无限元素列表的方法,具体实现可使用Yield来完成.下面所述的2段实例代码通过Python Yield 生成器实现了简单的无限元素列表.(www.jbxue.com)1.递增无限列表具体代码:def increment(): i = 0 while True: yield i i += 1 for j in increment(): print i if (j > 10) : break 2.斐波那契无限列表具体代码:

python学习第六天 - 列表(数组)

python当中的数组与java,c不太一样,数组相当于一个列表,一个列表中可以有,整型,字符串,浮点型等等. 定义格式如下: >>> list = [123,'小甲鱼',3.14] >>> list [123, '小甲鱼', 3.14] 介绍几种向列表中添加元素的方法 1.append() :向列表中增加新的元素,一次只能添加一个元素,默认添加到列表的末尾 >>> list.append('黑夜') >>> list [123, '

[Python] 正确复制列表的方法

new = old[:] Python老鸟都知道以上代码是什么意思.它复制列表old到new.它对于新手来说是种困惑而且应该避免使用这种方法.不幸的是[:]标记法被广泛使用,可能是Python程序员不知道更好的列表复制法吧. 首先我们需要了解Python是如何管理对象和变量.Python没有C语言中的变量.在C语言中,变量不止是个名字,它是字节集合并真实存在于内存某个位置上.而在Python中,变量仅仅是指向对象的标签. 看看以下语句: a = [1, 2, 3] 它表示我们创建了一个指引指向列

python学习笔记——列表生成式与生成器

1.列表生成式(List Comprehensions) python中,列表生成式是用来创建列表的,相较于用循环实现更为简洁.举个例子,生成[1*1, 2*2, ... , 10*10],循环用三行: 1 L = [] 2 for i in range(1,11): 3 L.append(i*i) 列表生成式只用一行,前面是生成规则,后面是初始元素,最后还可以加上判断条件: 1 [i*i for i in range(1, 11)] 列表生成式还可以实现多层循环,以及判断,刚刚的栗子再写复杂一

[python 笔记2]列表、字符串、字典(list?string?map?)

1.列表 1)python 中的列表初始化 list=[0,1,2,3,4,5,6,7,8,9] 变量名=[,,,,],当然初始列表可以为空 ps:看到[],熟悉C++的同学不禁想到了熟悉的数组,那么python中的列表和数组之间有什么区别联系呢? 在python中我们依然可以使用下标来操作列表,就像操作数组一样.但是,如果python只给我提供如此简(keng)单(die)的操作那怎么能体现出python的简介强大呢? 2)分片 分片是指使用索引来指定访问列表的范围,来访问多个元素,而不是仅仅

python数据结构之 列表和元组

python数据结构之 列表和元组 序列:序列是一种数据结构,它包含的元素都进行了编号(从0开始).典型的序列包括列表.字符串和元组.其中,列表是可变的(可以进行修改),而元组和字符串是不可变的(一旦创建了就是固定的).序列中包含6种内建的序列,包括列表.元组.字符串.Unicode字符串.buffer对象.xrange对象. 列表的声明: mylist = [] 2.列表的操作: (1) 序列的分片: 用法:mylist[startIndex:endIndex:step] exam: myli

Python 变量之列表与应用技巧

洛琳的笔记 Python 标准数据类型 Python 定义了一些标准数据类型,用于存储各种类型的数据.Python有五个标准的数据类型,分别是: Numbers(数字) String(字符串) List(列表) Tuple(元组) Dictionary(字典) Python 中的变量赋值不需要类型声明,也就是说声明变量不需要使用关键字.Python 中变量赋值之后该变量就被创建.可以简单对单一变量赋值,亦可对同一变量重新赋值(不同数据类型也可以),也可以同时为多个变量赋值,如下. counter

3.python元组与列表

Python的元组与列表类似,同样可通过索引访问,支持异构,任意嵌套.不同之处在于元组的元素不能修改.元组使用小括号,列表使用方括号. 创建元组 元组创建很简单,只需要在括号中添加元素,并使用逗号隔开即可 tuple = () #空元组 tuple2 = ('a','b','c') tuple3 = ('d','e','f') 可以用dir(tuple)查看元组支持的操作: 元组操作方法及实例展示 count 1 功能:统计元组中某元素的个数 2 语法:T.count(value) -> int