【python与数据结构】(leetcode算法预备知识)

笔记为自我总结整理的学习笔记,若有错误欢迎指出哟~

python与数据结构

Python 中常见的数据类型

1.数字类型:

  • 整数(int):表示整数值,例如 1、-5、100。
  • 浮点数(float):表示带有小数部分的数字,例如 3.14、-0.5、2.0。
  • 复数(complex):表示实部和虚部的复数,例如 2+3j。

2.布尔类型(bool):

  • 表示真(True)或假(False)的逻辑值。

3.字符串类型(str):

  • 表示文本数据,使用单引号或双引号括起来,例如 'Hello'、"World"。

4.列表类型(list):

  • 表示有序的可变序列,可以包含不同类型的元素,使用方括号括起来,例如 [1, 2, 'a', True]。

5.元组类型(tuple):

  • 类似于列表,但是不可变,使用圆括号括起来,例如 (1, 2, 'a', True)。

6.集合类型(set):

  • 表示无序且唯一的元素集合,使用花括号括起来,例如 {1, 2, 3}。

7.字典类型(dict):

  • 表示键值对的映射关系,使用花括号括起来,例如 {'name': 'Alice', 'age': 25}。

数据结构

1.数组(Array)

列表类型(list)

2.链表(Linked List)

python 复制代码
class ListNode:
	def __init__(self,x):
		self.val = x
		self.next = None

3.哈希表(Hash Table)

字典类型(dict)

4.队列(Queue)

list

进队:append()

出队:pop(0)

python 复制代码
l = [1,2,3,4,5]

l.append(6)
l
#[1, 2, 3, 4, 5, 6]

l.pop(0)
l
#[2, 3, 4, 5, 6]

deque(类似双端队列)

deque 是 Python 中的一个内置模块 collections 中的类,用于实现双端队列(double-ended queue)。双端队列是一种具有队列和栈特性的数据结构,支持在两端进行插入和删除操作。

deque 提供了以下常用操作:

  1. 创建双端队列:
    • 使用 deque() 函数创建一个空的双端队列。
    • 例如:from collections import dequed = deque()
  2. 在队列两端插入元素:
    • 使用 append(item) 在队列的右端插入一个元素。
    • 使用 appendleft(item) 在队列的左端插入一个元素。
    • 例如:d.append(1)d.appendleft(2)
  3. 在队列两端删除元素:
    • 使用 pop() 删除并返回队列右端的元素。
    • 使用 popleft() 删除并返回队列左端的元素。
    • 例如:d.pop()d.popleft()
  4. 访问队列两端的元素:
    • 使用 [-1] 索引访问队列右端的元素。
    • 使用 [0] 索引访问队列左端的元素。
    • 例如:d[-1]d[0]
  5. 获取队列长度:
    • 使用 len(d) 获取队列中的元素个数。
  6. 判断队列是否为空:
    • 使用 not dlen(d) == 0 判断队列是否为空。

deque 还支持其他一些方法,如旋转队列、计数元素出现次数、反转队列等。双端队列在实际应用中常用于需要高效地在两端进行插入和删除操作的场景,比如实现缓存、任务调度等。

右进:append()

右出:pop()

左进:appendleft()

左出:popleft()

python 复制代码
from collections import deque
q = deque([1,2,3])

q.append(4)
q
#deque([1, 2, 3, 4])

q.pop()
q
#deque([1, 2, 3])

q.appendleft(4)
q
#deque([4, 1, 2, 3])

q.popleft()
q
#deque([1, 2, 3])

使用:先进后出

python 复制代码
#使用方法1:队头<---   队列   <---队尾
#append()	队尾
#popleft()	队头

from collections import deque
q = deque([1,2,3])

q.append(4)
q
#deque([1, 2, 3, 4])

q.popleft()
q
#deque([2, 3, 4])
python 复制代码
#使用方法2:队尾--->   队列   --->队头
#appendleft()	队尾
#pop()	队头

from collections import deque
q = deque([1,2,3])

q.appendleft(4)
q
#deque([4, 1, 2, 3])

q.pop()
q
#deque([4, 1, 2])

5.栈(Stack)

list

进栈:append()

出栈:pop()

python 复制代码
l = [1,2,3,4,5]

l.append(6)
l
#[1, 2, 3, 4, 5, 6]

l.pop()
l
#[1, 2, 3, 4, 5]

deque

右进:append()

右出:pop()

左进:appendleft()

左出:popleft()

使用:先进先出,后进后出

6.堆(Heep)


heapq 是 Python 中的一个内置模块,提供了堆(heap)算法的实现。堆是一种特殊的树形数据结构,满足以下性质:

  • 堆是一棵完全二叉树;
  • 堆中的每个节点都必须大于等于(或小于等于)其子节点。

Python 中的 heapq 模块提供了以下常用函数:

  1. heapify(iterable)
    • 将一个可迭代对象转化为堆,时间复杂度为O*(*n)。
    • 例如:heapq.heapify([3, 1, 4, 1, 5, 9])
  2. heappush(heap, item)
    • 将一个元素加入堆中,时间复杂度为 O(logn)。
    • 例如:heapq.heappush([3, 1, 4, 1, 5, 9], 2)
  3. heappop(heap)
    • 弹出堆中最小的元素,时间复杂度为 O(logn)。
    • 例如:heapq.heappop([1, 1, 3, 4, 5, 9])
  4. heapreplace(heap, item)
    • 弹出堆中最小的元素,并将新元素加入堆中,时间复杂度为 O*(*logn)。
    • 例如:heapq.heapreplace([1, 1, 3, 4, 5, 9], 2)
  5. nlargest(n, iterable[, key])
    • 返回可迭代对象中最大的 n 个元素,时间复杂度为 O*(*nlogk),其中 k=min(n,len(iterable))。
    • 例如:heapq.nlargest(3, [1, 2, 3, 4, 5, 6, 7, 8, 9])
  6. nsmallest(n, iterable[, key])
    • 返回可迭代对象中最小的 n 个元素,时间复杂度为 O*(*nlogk),其中 k=min(n,len(iterable))。
    • 例如:heapq.nsmallest(3, [9, 8, 7, 6, 5, 4, 3, 2, 1])

heapq 模块可以用于实现堆排序、优先队列等算法,同时也可以用于解决一些常见的算法问题,如求 top-k 问题、求中位数等。在使用 heapq 模块时,需要注意元素的比较方式,可以通过传递 key 参数来指定比较函数。

python 复制代码
from heapq import * 

a = [1,2,3,4,5]
heapify(a)
a
#[1, 2, 3, 4, 5]

heappush(a,-1)
a
#[-1, 2, 1, 4, 5, 3]

heappop(a)
a
#[1, 2, 3, 4, 5]

nlargest(3,a)
#[5, 4, 3]

nsmallest(3,a)
#[1, 2, 3]

7.树(Tree)

数据类型常见操作

1.数字类型

  • abs():绝对值
  • max()/min():最大值/最小值
  • pow(x,y):x^y^
  • sqrt(x):根号x
python 复制代码
abs(-5)
#5

max(1,3,6)
#6

min(1,-1,4)
#-1

pow(3,3)
#27

import math
math.sqrt(9)
#3.0

2.布尔类型

python 复制代码
bool(0)
#False

bool(2)
#True

bool(-1)
#True

3.字符串类型

  • len(s):字符串长度,空格也算
  • max(s):最大字符
  • max(s):最小字符
  • s.count('H'):统计H的个数
  • s.isupper():是否为大写
  • s.islower():是否为小写
  • s.isdigit():是否为数字
  • s.lower():转换为小写
  • s.upper():转换为大写
  • s.swapcase():大小写转换
  • s.split():分割字符串
python 复制代码
s="Hello world"

len(s)
#11

max(s)
#'w'

s.count("l")
#3

s.isupper()
#False

s.islower()
#False

s.isdigit()
#False

s.lower()
#'hello world'

s.upper()
#'HELLO WORLD'

s.swapcase()
#'hELLO WORLD'

s.split()
#['Hello', 'world']
  • s.strip():去除两边字符串
  • s.lstrip():去除左边字符串
  • s.rstrip():去除右边字符串
  • s.replace():交换字符串。

注意:strip()不能去除字符串中间的空格,去除中间空格用replace()

python 复制代码
a='   hello world   '
a.strip()
#'hello world'

a.lstrip()
#'hello world   '

a.rstrip()
#'   hello world'

a.replace(' ','')
#'helloworld'

4.列表类型

python 复制代码
a = [1,54,2,22,4]
  • 增加
    • a.append(元素)
    • a.insert(位置,元素)
python 复制代码
a.append(25)
a
#[1, 54, 2, 22, 4, 25]

a.insert(0,2)
a
#[2, 1, 54, 2, 22, 4, 25]
  • 更新
    • a[位置]=元素
python 复制代码
a[0]=3
a
#[3, 1, 54, 2, 22, 4, 25]
  • 删除
    • a.pop(位置) 默认最后元素
    • a.remove(元素)
python 复制代码
a.pop()
#25

a.remove(3)
a
#[1, 54, 2, 22, 4]
  • 遍历

    • for x in a:

      ​ print(x)

    • for i in range(len(a)):

      ​ print(a[i])

    • b=[x**2 for x in a]:

      ​ print(x)

python 复制代码
for x in a:
    print(x)
'''
1
54
2
22
4
'''

for i in range(len(a)):
    print(a[i])
'''
1
54
2
22
4
'''

b=[x**2 for x in a]
b
#[1, 2916, 4, 484, 16]
  • len(l):列表长度
  • max(l):最大元素,列表为同一类型
  • max(l):最小元素,列表为同一类型
  • l.reverse():翻转
  • l.sort(reverse = True) :降序排序
  • in:元素是否再列表
  • 切片
  • l.clear():清空列表
python 复制代码
l=[1,2,3,4,5,6]
len(l)
#6

max(l)
#6

min(l)
#1

l.reverse()
l
#[6, 5, 4, 3, 2, 1]

l.sort(reverse = False) #降序
l
#[1, 2, 3, 4, 5, 6]

4 in l
#True

l[0:2]
#[1, 2]

l.clear()
l
#[]

5.元组类型

python 复制代码
a=(1,1.5,'abc')
  • 查找
python 复制代码
a[0]
#1

a[2]
#'abc'
  • len(a)
  • in
  • 切片
python 复制代码
len(a)
#3

1 in a
#True

a[0:2]
#(1, 1.5)

6.集合类型

  • 增加
    • a.add()
    • a.update()
  • 删除
    • a.remove()
python 复制代码
a={1,1.5,'abc'}
a.add(2)
a
#{1, 1.5, 2, 'abc'}

a.update({4,5})
a
#{1, 1.5, 2, 4, 5, 'abc'}

a.remove(1.5)
a
#{1, 2, 4, 5, 'abc'}
  • in
  • 集合间的操作
    • a-b:a有b没有
    • a|b:a有或b有
    • a&b:a、b都有
    • a^b:a、b不同时有
python 复制代码
a={1,2,3}
b={3,4,5}

a-b
#{1, 2}

a|b
#{1, 2, 3, 4, 5}

a&b
#{3}

a^b
#{1, 2, 4, 5}

7.字典类型

  • 增/改
    • dict[key]=value
    • dict.pop(key)
  • in
    • key in dict
python 复制代码
s = {'age':18,'name':'小明'}

s['age']=19
s
#{'age': 19, 'name': '小明'}

s['city']='长沙'
s
#{'age': 19, 'name': '小明', 'city': '长沙'}

s.pop('city')
s
#{'age': 19, 'name': '小明'}

'age' in s
#True
  • 遍历
    • key
    • value
    • k,v
python 复制代码
for key in s:
    print(key)
#age
#name

for value in s.values():
    print(value)
#19
#小明

for k,v in s.items():
    print(k,v)
#age 19
#name 小明
相关推荐
AI视觉网奇26 分钟前
Detected at node ‘truediv‘ defined at (most recent call last): Node: ‘truediv‘
人工智能·python·tensorflow
szuzhan.gy29 分钟前
DS查找—二叉树平衡因子
数据结构·c++·算法
GuYue.bing1 小时前
网络下载ts流媒体
开发语言·python
一只码代码的章鱼1 小时前
排序算法 (插入,选择,冒泡,希尔,快速,归并,堆排序)
数据结构·算法·排序算法
牛顿喜欢吃苹果1 小时前
linux创建虚拟串口
python
-Mr_X-1 小时前
FFmpeg在python里推流被处理过的视频流
python·ffmpeg
青い月の魔女1 小时前
数据结构初阶---二叉树
c语言·数据结构·笔记·学习·算法
一个不秃头的 程序员1 小时前
代码加入SFTP JAVA ---(小白篇3)
java·python·github
susu10830189111 小时前
python实现根据搜索关键词爬取某宝商品信息
爬虫·python
我要出家当道士2 小时前
Nginx单向链表 ngx_list_t
数据结构·nginx·链表·c