python学习(1) - 基础数据结构

76 阅读5分钟

python学习(1) - 基础数据结构

文章首发于:我的个人博客 欢迎大佬们来逛逛

列表

列表是最简单的数据类型,相当于数组。

  1. 列表的基础操作函数
  2. 列表模拟栈
  3. 队列
  4. 列表推导式

以下是列表的常见操作

l = [1, 2, 3, 4, 5]

# 往末尾添加一个元素
l.append(6)
l[len(l):] = [7]

l2 = [0]
# 所有元素添加到另一个列表中
l2.extend(l)
l2[len(l2):] = l

# 插入一个元素,插入到第一个参数的位置处
l.insert(0, 99)
l.insert(len(l), 999)  # 相当于在末尾插入一个元素

# 移除第一个指定的元素
l.remove(99)  # 没有的话会返回一个错误

# 删除指定位置的元素,并且这个元素可以被返回
i = l.pop() # 删除尾元素,并且弹出这个值

# 清除所有的元素
l.clear()

l = [1, 2, 5, 5, 5]
# 返回第一个值为val的索引
i = l.index(5)

# 返回val值出现的次数
cnt = l.count(5)

# 就地排序列表
l.sort()

# 就地翻转列表
l.reverse()

# 返回列表的一个浅拷贝,相当于 r = l[:]
r = l.copy()

print(l)

print('--------------------------'*2)

""" 堆栈的模拟 """

l = [1, 2, 3]
# 入栈
l.append(4)
l.append(5)
# 出栈
l.pop()
l.pop()
print(l)

""" 队列的模拟 """
# 双端队列
from collections import deque

queue = deque(["a", "b", "c"])
queue.append("d")
queue.append("e")
queue.popleft()
queue.popleft()
print(queue)

""" 列表推导式 """
# 普通的方法:从序列创建列表
seq = []
for i in range(10):
	seq.append(i ** 2)
print(seq)
seq.clear()

# 列表推导式(1) 推荐!
seq = [x ** 2 for x in range(10)]
print(seq)
seq.clear()

# (2)
seq = list(map(lambda x: x ** 2, range(10)))
print(seq)

# 双重循环输出不重复的组合
print([(x, y) for x in [1, 2, 3] for y in [1, 2, 3] if x != y])

l = [-2, -1, 0, 1, 2]
l1 = [x ** 2 for x in l]
l2 = [abs(x) for x in l]
l3 = [x for x in l if x >= 0]
# print(l1)
# print(l2)
# print(l3)

l = ['  wain  ', '   agda ', 'Edward    ']
# strip方法可以删除字符串头尾的空格
print([str.strip() for str in l])

ll = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
# 二维列表转换为一维列表
print([x for item in ll for x in item])

from math import pi

# round保留小数
print([str(round(pi, i)) for i in range(1, 10)])

# 二维矩阵的转置 3X4 -> 4X3
l = [
	[1,2,3,4],
	[4,5,6,7],
	[6,7,8,9]
]
print([[row[i] for row in l] for i in range(len(l[0]))])
# zip表示“压缩” 将多个对象中对应的元素打包成一个个元组,然后使用list转换为列表
# zip(*)表示“解压” 还原为多个对象的形式
print("-----------------------------------"*2)
l_zip = list(zip(*l))
print(l_zip)
# 解压,还原为三个对象列表
l1, l2, l3 = zip(*l_zip)
print(l1)
print(l2)
print(l3)

print('---------------------------'*2)

""" del语句 """

l = [1,2,3,4,5,6,7,8,9]
print(l)
# 列表的切片删除 左闭右开
del l[1:5]
print(l)
# 使用del来清空列表
del l[:]
print(l)
# 删除整个变量
del l

元组和序列

元组是python的一种标准序列类型

一个元组由数个 逗号 组成:

t = 123,456,"woaini"
print(t)
u = t, (1,2,3,"66666")
print(u)
--------
(123, 456, 'woaini')
((123, 456, 'woaini'), (1, 2, 3, '66666'))

元组始终携带括号

元组是不可变的,因此不能给一个元组的某一个元素赋值。

元组和列表的区别:

  1. 元组是不可变的,并且元组的一个嵌套括号内可以包含多种不同类型的值,可以通过索引访问
  2. 列表是可变的,并且只包含同一种类型的值,可以通过迭代访问

注意:

创建一个空元组? 直接输入一个括号即可。

创建一个只含元素的元组? 需要输入 元素,


序列的拆封:

x, y = u
-------
(123, 456, 'woaini')
(1, 2, 3, '66666')

集合

创建集合的方式:

  1. 大括号 {}
  2. 函数 set()
basket = {'apple', 'orange', 'apple', 'pear', 'orange', 'banana'}
basket2 = set('aaabbbccdef')
print(basket)
print(basket2)
if 'apple' in basket:
	print('yes!')
------------
{'orange', 'pear', 'banana', 'apple'}
{'b', 'd', 'f', 'c', 'a', 'e'}
yes!

注意到:

  1. 集合中不包含重复的元素
  2. 如果使用 set() 创建集合,那么创建的是元素字符。
  3. 可以判断某元素是否在集合中。

集合推导式语法:

print({x for x in 'abcdefg' if x not in 'abcd'})
-----------
{'f', 'e', 'g'}

字典

字典由 关键字 组成。

由于关键字需要是索引,因此关键字必须是 **不可变类型。**通常为字符串或者数值,不能用列表做关键字。

字典的创建形式: {关键字: 值} 中间使用:分割

# 创建字典
dic = {'k1':123, 'k2':234, 'k3':456}
print(dic)
# 修改字典值
dic['k2'] = 999
print(dic)
# 删除字典键值对
del dic['k2']
print(dic)
-----------
{'k1': 123, 'k2': 234, 'k3': 456}
{'k1': 123, 'k2': 999, 'k3': 456}
{'k1': 123, 'k3': 456}

字典的关键字可以组成列表:

list 形成列表, sorted 对列表排序

# 返回所有关键字组成的列表
print(list(dic.keys()))
print(sorted(list(dic.keys())))
for key in dic:
	print(dic[key], end=' ')
--------
['k1', 'k3', 'k2']
['k1', 'k2', 'k3']
123 456 666

使用 dict 直接创建字典:

dict中形成字典的大括号既可以使用 {} 也可以使用 [] ,但是键值对必须()


dic = dict({('sape', 4139), ('guido', 4127), ('jack', 4098)})

使用字典推导式创建字典:

dic = {x:x**2 for x in range(10)}

dict 创建关键字都是字符串类型的字典:

dic = dict(a=123,b=456,d=789)

循环技巧

在字典中,使用 items() 函数来遍历键值对:

for (k,v) in dic.items():
	print(k,v)
--------------
a 123
b 456
d 789

在列表中,使用 enumerate 获得索引值和数值:

l = [1,2,3,4,5]
# 获取索引和值
for i,v in enumerate(l):
	print(i,v)
----------
0 1
1 2
2 3
3 4
4 5

使用 zip 打包需要同时循环的列表:

questions = ['name', 'quest', 'favorite color']
answers = ['lancelot', 'the holy grail', 'blue']
for q,a in zip(questions,answers):
	print("What is your {0}: {1}".format(q,a))
--------------
What is your name: lancelot
What is your quest: the holy grail
What is your favorite color: blue

reversed 逆向打印:

for num in reversed(range(1,10)):
	print(num,end=' ')

去重排序 输出:首先转换为集合,然后再sorted:

basket = ['apple', 'orange', 'apple', 'pear', 'orange', 'banana']
for str in sorted(set(basket)):
	print(str,end=' ')
------------
apple banana orange pear