Python自学(六)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/vivien1997/article/details/98207353
※列表与元组
◎列表(List):内建数据结构,用来存储一系列元素
如:lst = [5.4,’hello’,2]
>>> lst = [5.4,'hello',2]
>>> lst[0]
5.4
>>> lst[3]
Traceback (most recent call last):
  File "<pyshell#2>", line 1, in <module>
    lst[3]
IndexError: list index out of range
>>> lst[2]
2
>>> lst[1]
'hello'
>>> lst[1:3]              #切片操作
['hello', 2]
◎列表与字符串:
相同点:索引([ ])、切片([ : ])、拼接(+)和重复(*)、成员(in)、长度(len)、循环(for)
>>> lst + [1.2,3.4]
[5.4, 'hello', 2, 1.2, 3.4]
>>> lst * 2
[5.4, 'hello', 2, 5.4, 'hello', 2]
>>> 5.4 in lst
True
>>> 5 in lst
False
>>> len(lst)
3
>>> for e in lst:
	print(e)	
5.4
hello
2
不同点:使用[ ]生成,元素之间用逗号分隔;可以包含多种类型的对象,字符串只能是字符;内容是可变的,字符串的内容是不可变的
方法:
1.lst[0] = ‘a’
2.lst[0:2] = [1.2,5.4,5]
3.lst.append(‘abc’),lst.extend([‘def’,’gh’])                 #追加元素
4.lst.insert(位置,内容)                      #任意位置插入元素
5.lst.pop(位置(无参数默认删除最后一个)),list.remove(内容)        #删除元素
6.lst.sort()                        #排序
7.lst.reverse()                     #逆序



◎读取30个数字,并计算平均数
nums = []
for i in range(30):
    nums.append(float(input()))
s = 0
for num in nums:
    s += num
avg = s / len(nums)          #s = sum(nums) , sum()为内建函数,内建函数有max,min等
print("平均数为",avg)
◎列表赋值
代码:
a = [1,2,3]
b = a                            #b = a[:]   生成新的列表
b[1] = 4
print(a[1])
结果为:4                       #结果为:2
◎列表作函数参数
例:交换列表中两个元素的函数
def swap(a,b):
    tmp = a
    a = b
    b = tmp

x = 10
y = 20

swap(x,y)
print("x = ",x,"y = ",y)
结果为:x = 10   y = 20   未完成交换
def swap(lst,a,b):
    tmp = lst[a]
    lst[a] = lst[b]
    lst[b] = tmp

x = [10,20,30]

swap(x,0,1)
print("x = ",x)      
结果为:x = [20,10,30]      完成交换
例:查找:在列表中查找一个值,并返回该值第一次出现的位置;如果该值不存在,则返回-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,13))
print(search(lst,2))
结果为:
3
-1
lst.index( ):[1,2,2].index(2)           = 1#第一次出现位置下标
※时间复杂度
量化一个算法的运行时间为输入长度的函数
不需要显式的计算这些常数
大O表示,只保留高阶项
                   线性查找时间复杂度均为O(n)


◎二分查找:编写函数bi_search(),输入一个有序(由小到大)列表和一个,如果该值在列表中,则返回相应位置,否则返回-1
def b_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,15]

print(b_search(lst,8))
时间复杂度:
◎排序:冒泡排序、选择排序
1、选择排序   时间复杂度为
程序:
版本1:1.找到最小元素 2.删除它,将其插入相应的位置 3.对于剩余元素,重复步骤1.2
def select_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,5,8,2]
select_sort(lst)
print(lst)
结果为:[2,5,8,10]
版本2:1.找到最小元素 2.和第一个元素交换 3.对于剩余的元素,重复步骤1.2
def swap(lst,i,j):
    tmp = lst[i]
    lst[i] = lst[j]
    lst[j] = tmp
    
def select_sort_v2(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,5,8,2]
select_sort_v2(lst)
print(lst)
结果为:[2,5,8,10] 
2、冒泡排序    时间复杂度为,但比选择排序速度快
程序:
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 = [10,5,8,2,13,9]
bubble_sort(lst)

print(lst)
结果为:[2, 5, 8, 9, 10, 13]
3、内建排序函数:算法(quicksort),时间复杂度
(1)sorted()
>>> lst = [5,2,10,9,8]
>>> sorted(lst)         #不改变列表顺序
[2, 5, 8, 9, 10]
>>> lst
[5, 2, 10, 9, 8]         
(2)list.sort()
>>> lst
[5, 2, 10, 9, 8]
>>> lst.sort()           #改变列表顺序
>>> lst
[2, 5, 8, 9, 10]

※嵌套列表
列表的列表:
x = [[5,4,7,3],[4,8,7,9],[3,1,2]]
访问第三行、第二列元素:x[2][1]
len(x) = 3
◎实例:计算所有学生平均分students = [[‘Zhang’,84],[‘chen’,100],[‘Li’,77],[‘wang’,53]]
students = [['Zhang',84],['chen',100],['Li',77],['wang',53]]
s = 0
for student in students:
    s += student[1]

print(float(s) / len(students))
结果为:78.5
将分数由高到低显示
def f(a):
    return a[1]
students.sort(key = f,reverse = True)     
#students.sort(key = lambda x :x[1],reverse = True)       #实现排序
print(students)
结果为:[['chen', 100], ['Zhang', 84], ['Li', 77], ['wang', 53]]
◎列表的解析或推导:
一种由原列表创建新列表的简洁方法:[表达式for变量in列表if条件]
例:如生成值为{:x∈{1....9}}的列表
lst = []
for x in range(1,10):
    lst.append(x ** 2)
print(lst)
结果为:[1, 4, 9, 16, 25, 36, 49, 64, 81]
列表解析后代码为:
>>> lst = [x ** 2 for x in range(1,10)]
>>> lst
[1, 4, 9, 16, 25, 36, 49, 64, 81]
列表推导实现求平均分:
print(float(sum([x[1] for x in students]) / len(students)))
列表解析对所输入数字x的因数求和(输入6,结果1+2+3+6=12):
>>> [i for i in range(1,7) if 6 % i == 0]
[1, 2, 3, 6]
>>> sum([i for i in range(1,7) if 6 % i == 0])
12
◎lambda函数
定义匿名函数
>>> g = lambda x: x ** 2
>>> print(g(8))
64

※元组
元组即不可变列表
1.除了可改变列表内容的方法外,其他方法均适用于元组
2.索引、切片、len()、print()等均可用
3.append、extend、del等不可用
4.使用‘,’可以加(( ))创建元组
My_tuple = 1,’a’,3.14,True        //My_tuple = (1,’a’,3.14,True)
5.需要元组的原因是保证列表内容不被修改
◎元组赋值
交换两个值
>>> a = 10
>>> b = 20
>>> a,b = b,a
>>> a
20
>>> b
10
切分邮件地址
>>> name,domain = '[email protected]'.split('@')
>>> name
'car'
>>> domain
'hit.edu.cn'
返回最大值最小值
def max_min(lst):
    max = min = lst[0]
    for i in lst:
        if i > max:
            max = i
        if i < min:
            min = i
    return max,min

lst = [10,60,20,5] 

print(max_min(lst))
结果为 (60, 5)
◎DSU模式(Decorate,Sort,Undecorate,装饰、排序和反装饰)
words = ['ab','defg','hijkl','xyuvw']
words.sort(key = lambda x:len(x),reverse = True)
print(words)
结果为:['hijkl', 'xyuvw', 'defg', 'ab']

猜你喜欢

转载自blog.csdn.net/vivien1997/article/details/98207353