note 9 列表、时间复杂度、排序
列表 List
+内建(built-in)数据结构(data structure),用来存储一系列元素(items)
如:lst = [5.4,'hello',2]

前向索引、后向索引、切片、拼接、成员、长度...
列表与字符串
+相同点
索引( [ ] 运算符)
切片( [:] )
拼接( + )和重复( * )
成员( in 运算符 )
长度( len() 函数 )
循环( for )
+不同点
使用 [ ] 生成,元素之间用逗号分隔
可以包含多种类型的对象;字符串只能是字符
内容是可变的;字符串是不可变的
列表的方法
+列表的内容是可变的
my list[0] = 'a'
my list[0:2] = [1.2,3,5.6]
my list.append()#追加元素 改变内容
my list.extend()#追加列表
my list.insert()#任意位置插入元素
my list.pop(),my list.remove()#删除元素 删除某个下标的元素
my list.remove(5)#删除元素,删除某内容
my list.sort()#排序
my list.reverse()#逆序
...
读取10个数字,并计算平均数
内建函数sum
avg = sum(nums) / len(nums)
max
min
...
nums = []
for i in range(10):
    nums.append(float(raw_input()))
avg = sum(nums) / len(nums)
print avg
列表赋值

列表做函数参数
交换列表中两个元素的函数

示例:查找
1.返回下标
def search(lst,x):
    for i in range(len(lst)):
        if lst[i] == x:
            return i
    return -1
lst = [10,5,8,13]
print search(lst,8)
2.返回下标
index()方法
[1,2,3],index(2)
返回第一次的下标
要查找的元素不在列表中 会抛出异常,ValueError: 7 is not in list
lst = [10,5,8,13]
print lst.index(7)
线性查找
最坏运行时间:k0n+k1
时间复杂度
+量化一个算法的运行时间为输入长度的函数
+不需要显式的计算这些常数
如:4n+10和100n+137都与输入规模成正比
+大O表示,只保留高阶项

+线性查找的时间复杂度为:O(n)
+大O能告诉我们什么?
如果算法A的复杂度为O(n),算法B的复杂度为O(n^2),对于较大的输入,A总是比B快
如果算法A的复杂度为O(n),当输入规模翻倍时,运行时间也翻倍
+大O不能告诉我们什么?
实际运行时间

对于小规模输入的行为

函数的增长率

二分查找



不一定是元素第一次出现位置的下标
def bi_search(lst,x):
    low = 0
    high = len(lst) - 1
    while low <= high:
        mid = (low + high) / 2
        if lst[mid] == x:
            return mid
        elif lst[mid] > x:
            high - mid - 1
        else :
            low = mid + 1
    return - 1
lst = [5,8,10,13]
print bi_search(lst,5)
二分查找的时间复杂度:

排序 Sort
+将一个无序列表,按照某一顺序(由小到大或由大到小)排列
+是计算机科学中常见而且重要的任务
+有许多不同的算法,最简单直观的为以下两种
选择排序 selection sort
冒泡排序 bubble sort
选择排序
找到最小的元素
删除它,然后将其插入相应的位置
对于剩余元素,重复步骤1
def selection_sort(lst):
    for i in range(len(lst)):
        min_index = i
        for j in range(i + 1,len(lst)):
            if lst[j] < lst[min_index]:
                min_index = j
        lst.insert(i,lst.pop(min_index))
lst = [10,8,5,13]
selection_sort(lst)
print lst
找到最小的元素
和第一个元素交换
对于剩余的元素,重复步骤1和2

def swap(lst,i,j):
    tmp = lst[i]
    lst[i] = lst[j]
    lst[j] = tmp
def selection_sort(lst):
    for i in range(len(lst)):
        min_index = i
        for j in range(i + 1,len(lst)):
            if lst[j] < lst[min_index]:
                min_index = j
        swap(lst,i,min_index)
lst = [10,8,5,13]
selection_sort(lst)
print lst
选择排序的时间复杂度

冒泡排序
与选择排序类似,但是每次遍历不止交换一次
每次遍历,将最大的值排在最后

+提示:一单列表排好序,算法可以停止
def swap(lst,i,j):
    tmp = lst[i]
    lst[i] = lst[j]
    lst[j] = tmp
def bubble_sort(lst):
    top = len(lst) - 1
    is_exchanged = True
    while is_exchanged:
        is_exchanged = False
        for i in range(top):
            if lst[i] > lst[i + 1]:
                is_exchanged = True
                swap(lst,i,i + 1)
        top -= 1
lst = [12,10,8,5,13]
bubble_sort(lst)
print lst
时间复杂度 O(n^2),与选择排序相同,但是通常速度更快
内建排序函数
sorted()函数

list.sort()方法

算法:quicksort
时间复杂度:

比选择和冒泡排序更快
嵌套列表

计算所有学生平均分
students = [['Zhang',84],['Wang',98],['Li',76]]
s = 0
for student in students:
    s += student[1]
print float(s) / len(students)
列表的解析或列表的推导 List Comprehension
+一种有原列表创建新列表的简洁方法
[表达式 for 变量 in 列表 if 条件]

lst = [x**2 for x in range(1,10)]
列表推导实现求平均分
students = [['Zhang',84],['Wang',98],['Li',76]]
print float(sum([x[1] for x in students])) / len(students)
使用列表解析对所输入数字x的因素求和
如:如果输入6,应该显示12,即1+2+3+6 = 12
sum([i for i in range(1,x + 1)if x % i == 0])
按照成绩由高到低排序
1.
students = [['Zhang',84],['Wang',98],['Li',76]]
def f(a):
    return a[1]
students.sort(key = f , reverse = True)
print students
2.使用 lambda 函数
+定义匿名函数

没法直接调用,需要赋值给变量
students = [['Zhang',84],['Wang',98],['Li',76]]
students.sort(key = lambda x: x[1] , reverse = True)
print students												
											note 9 列表、时间复杂度、排序的更多相关文章
- 2019年6月12日——开始记录并分享学习心得——Python3.7中对列表进行排序
		
Python中对列表的排序按照是排序是否可以恢复分为:永久性排序和临时排序. Python中对列表的排序可以按照使用函数的不同可以分为:sort( ), sorted( ), reverse( ). ...
 - Python要如何实现(列表)排序?
		
排序,是许多编程语言中经常出现的问题.同样的,在Python中,如何是实现排序呢?(以下排序都是基于列表来实现) 一.使用Python内置函数进行排序 Python中拥有内置函数实现排序,可以直接调用 ...
 - easyui datagrid 点击列表头排序出现错乱的原因
		
之前我的导师,也就是带我的同事,使用datagrid,发现点击列表头排序出现乱序,按理说只有顺序和逆序两种排序结果.因为他比较忙,当时没解决,把排序禁掉了,后来又要求一定要排序,所以他交给我. 一开始 ...
 - Python list列表的排序
		
当我们从数据库中获取一写数据后,一般对于列表的排序是经常会遇到的问题,今天总结一下python对于列表list排序的常用方法: 第一种:内建函数sort() 这个应该是我们使用最多的也是最简单的排序函 ...
 - python内置数据类型-字典和列表的排序  python BIT sort——dict and list
		
python中字典按键或键值排序(我转!) 一.字典排序 在程序中使用字典进行数据信息统计时,由于字典是无序的所以打印字典时内容也是无序的.因此,为了使统计得到的结果更方便查看需要进行排序. Py ...
 - [转载]EF或LINQ 查询时使用IN并且根据列表自定义排序方法
		
原文地址:EF或LINQ 查询时使用IN并且根据列表自定义排序方法作者:李明川 EF和LINQ改变了原有的手写SQL时期的一些编码方法,并且增强了各数据库之间的移植性简化了开发时的代码量和难度,由于很 ...
 - iRSF快速简单易用的实现列表、排序、过滤功能
		
IRSF 是由javascript编写,iRSF快速简单易用的实现列表.排序.过滤功能(该三种操作以下简称为 RSF ). iRSF由三个类组成. iRSFSource 数据源 iRSFFilter ...
 - Python 列表元素里面含有字典或者列表进行排序
		
示例1:列表里面含有列表进行排序 s = [[1, 2], [100, 2], [33, 3], [25, 6]] s.sort(key=lambda k: k[0]) print(s) 结果: [[ ...
 - Java对数组和列表的排序1.8新特性
		
Java对数组列表的排序 数组 Integer[] a = new Integer[] { 1, 2, 3, 4, 5, 6, 9, 8, 7, 4, 5, 5, 6, 6 }; Arrays.sor ...
 
随机推荐
- Excel 导入时如何下载模板信息(Java)
			
大家知道,我们在实现 Excel 上传的时候,会让我们去下载个模板,然后实现导入功能.在此我在这里记录下来,以便后续的使用... 首先思考一个问题是 这个模板这么给前台,还有这个模板是这么来的,刚开始 ...
 - Dart 的function
			
方法的定义 返回类型 方法名 (参数1 ,参数2 ,...){ 方法体 返回值 } => 的使用
 - 第四次SCRUM任务
			
一.第四次SCRUM任务 继第三次的任务之后,对最终的部署做一定的完善,以及系统的BUG调试,压力测试,会议明确最终的方案. 二.用户故事 1.用户可以进行输入用户名密码登录和注册. 2.用户可以在程 ...
 - 【转存】阿里云服务器下 LAMP 环境配置 —— 基于 CentOS 6.3
			
阿里云服务器下 LAMP 环境配置 —— 基于 CentOS 6.3 Posted on 2016年2月10日 by 学院君 1.Apache 配置 —————————————————– vi / ...
 - pycharm+pydesigner+pyqt5 如何添加图片资源
			
pydesigner 上添加资源比较容易: 步骤一用于编辑,步骤二步创建,步骤三创建文件新的qrc: 步骤一:新建一个Prefix,步骤二给prefix添加资源文件.至此,资源文件添加完成 采用 Py ...
 - Temporary failure in name resolutionf的解决方法
			
Linux有时还蛮烦的这个不能用那个不能用,只能多折腾了. 今天又是,ping z.cn的时候直接报错 Temporary failure in name resolutionf 这个一般都知道是DN ...
 - 第五章HTML
			
HTML介绍 标签:有一个头,一尾 <!DOCTYPE html><html lang="en"><head> <!-- 文档的标题.编码 ...
 - linux子系统ubuntu16.04安装使用xrdp当远程桌面
			
参考文献:https://icytown.com/windows/windows-subsystem-for-linux-gui-xubuntu/ https://jingyan.baidu.com/ ...
 - find命令简单使用
			
find命令是Linux系统查找文件的命令,能帮助用户在使用.管理Linux的日常事务时方便的查找出用户所需要的文件,find命令基本格式是:find [路径] [选项] [操作]. 列举一下find ...
 - DevExpress GridControl控件行内新增、编辑、删除添加选择框
			
以下为内容以图片居多1234表示点击顺序 先新增一行 操作和新增数据行一样 打开ColumnEdit 选择new ButtenEdit new上方会出现一个系统命名的button 命名可以更改必须 ...