[Python]常用数据存储结构.md

※ 以下代码运行于Python3

因工作需要,开始接触python语言,这大概是我用过最优雅的语言,非常的简洁。js再懒咱还会使用var,python甚至连声明的数据类型都省略了。
除了基本基本语法外,列表、字典等数据结构是工作中用的最为频繁的部分,所以在学习的时候整理了常用的函数与技巧来便于自己以后查询,若有新的技巧也会在后续更新上来。

序列切片Sequence

序列并不是一种明确的类型而是一种种类,列表、元组、字符串、range都属于序列。本质是浅拷贝指定的元素组成新的容器,各自具备的切片功能形式上有所差异。
序列的特征就是可以切片,如下

seq = [1,2,3,4,5,6]

seq[:]    # 从头到尾
# [1,2,3,4,5,6]

seq[0:4]    # 从0到第4位(不包括第4位)
# [1,2,3,4]

seq[0:-1]    # 从0到倒数第1位
# [1,2,3,4,5]

seq[0:-1:2]    # 从0到倒数第1位,步进为2
# [1,3,5]

seq2 = seq[::-1]    # 翻转序列

列表List

关键字为list,列表是一种可变的有序序列,就像字符串被定义为引号之间的字符一样,列表也是通过在方括号之间[]的值定义的。
创建

empty_list = []    # 空列表
sea_creatures = ['shark', 'cuttlefish', 'squid', 'mantis shrimp', 'anemone']

※(假设以下操作都是单独运行的,sea_creatures没有元素变化)
添加:添加元素至末尾

sea_creatures .append('dolphin')

插入:在某个位置插入一个元素

sea_creatures .insert(0, 'dolphin')

调用(或赋值):通过索引取出元素,类似地有切片返回多个元素

sea_creatures[0]    # 'shark'
sea_creatures[-1]    # 'anemone',-1表示倒数第一个,类似有-2、-3

拼接:将两个列表拼接为一个数组

oceans = ['Pacific', 'Atlantic', 'Indian', 'Southern', 'Arctic']
sea_creatures.extend(oceans )    
# ['shark', 'cuttlefish', 'squid', 'mantis shrimp', 'anemone', 'Pacific', 'Atlantic', 'Indian', 'Southern', 'Arctic']

数学运算符 +、+=、=(使用+=或*=会多一步赋值操作,但会改变sea_creatures列表)

print(sea_creatures + oceans)
# ['shark', 'cuttlefish', 'squid', 'mantis shrimp', 'anemone', 'Pacific', 'Atlantic', 'Indian', 'Southern', 'Arctic']
print(sea_creatures * 2)
# ['Pacific', 'Atlantic', 'Indian', 'Southern', 'Arctic', 'Pacific', 'Atlantic', 'Indian', 'Southern', 'Arctic']

删除:删除指定元素

del sea_creatures[0]
# 或
sea_creatures.remove('tiger')    # 'tiger'不存在则会报错(若有多个tiger则会删除序号小的那一个)
# 或
sea_creatures.pop(0)    # 返回指定位置元素并移除该元素,若不指定index默认移除最后一个元素

查找:

sea_creatures.index('tiger')    # 返回指定元素的index,若找不到该元素会报错
# 或者
'tiger' in sea_creatures    # 查找指定元素是否在列表中,返回布尔值

浅拷贝:会返回一个与sea_creatures相同元素的数组

sea_creatures.copy()

长度

len(sea_creatures)    # 5

遍历

for creature in sea_creatures:
    print(creature)
# 或者
for i in range(len(sea_creatures)):
    print(creature)

清空

namelist.clear()

反转:将列表中元素顺序翻转

list(reversed(sea_creatures))
# 或
sea_creatures.reverse()
# 或
sea_creatures = sea_creatures[::-1]

合并为字符串:将列表里的元素合并为字符串

''.join(map(str,sea_creatures))    # map(str,sea_creatures)表示对sea_creatures中的每一个元素进行str(element)操作
# 或
''.join(str(i) for i in arr)    # 这里使用了list comprehension,是一种简便用法,效果与上述相同    

sort()排序

# sort(key=None, reverse=False)
# key - 指向一个函数,这个函数只有一个传参,列表list中的每一个元素都会被作为参数传入这个函数,然后通过函数的返回值大小来排序
# reverse - False表示升序,反之降序,默认为False
# 使用list.sort()返回值为None,因为sort()函数直接改变了list本身,如果不希望改动原数据最好使用sorted()
# 例如按照元素原本大小排序
num_list = [5,2,48,6,23]
def sort_rule(num):
    return num
num_list.sort(key = sort_rule)
print(num_list)    # [2, 5, 6, 23, 48]

sorted()排序

# sorted(iterable, *, key=None, reverse=False)
# iterable - 可迭代的容器,一般是list、dictionary等
# 返回值是一个已经排好序的列表,所以这个函数不会改动原列表;可以进行多次排序例如先按年龄来再按名字排。
# 例如:使用sorted()先对分数排序,再对年龄排序,这里用到了operator库的两个函数。
from operator import itemgetter, attrgetter
student_tuples = [
    ('john', 'A', 15),
    ('jane', 'B', 12),
    ('dave', 'B', 10),
]
student_objects = [
    Student('john', 'A', 15),
    Student('jane', 'B', 12),
    Student('dave', 'B', 10),
]
class Student:
    def __init__(self, name, grade, age):
        self.name = name
        self.grade = grade
        self.age = age
    def __repr__(self):
        return repr((self.name, self.grade, self.age))

sorted(student_tuples, key=itemgetter(1,2))
[('john', 'A', 15), ('dave', 'B', 10), ('jane', 'B', 12)]

sorted(student_objects, key=attrgetter('grade', 'age'))
[('john', 'A', 15), ('dave', 'B', 10), ('jane', 'B', 12)]

列表解析(List Comprehension)
List Comprehension是对for循环的一种简洁用法,其结构形如 x for x in iterable

# 例如
shark_letters = [letter for letter in 'shark']

# 等价于
shark_letters = []
for letter in 'shark':
    shark_letters.append(letter)    # ['s', 'h', 'a', 'r', 'k']

# 可以后接if语句来表示筛选:
shark_letters = [letter for letter in 'shark' if letter != 'a']

# 还可以后接for循环:
my_list = [x * y for x in [20, 40, 60] for y in [2, 4, 6]]

# 等价于
my_list = []
for x in [20, 40, 60]:
    for y in [2, 4, 6]:
        my_list.append(x * y)

元组Tuple

关键字为tuple,元组是一种不可变的有序元素序列,不可变这点类似字符串,元素的值一旦定义后不能再改变。
创建

empty_tuple2 = ()    # 空元组
one_tuple = ('just one', )    # 一个元素的元组
student1 = ('zhangsan', 'Math', 22, ['Hunan', 'Changsha'])
student2 = ('lisi', 'Machine', 21, ['Guangdong', 'Guangzhou'])

类似于list,tuple有取值和数学运算符(没有+=和*=)

student_name = student[0]    # 'zhangsan'
print(student1 +student2 )
# ('zhangsan', 'Math', 22, ['Hunan', 'Changsha'], 'lisi', 'Machine', 21, ['Guangdong', 'Guangzhou'])
print(student1 * 2)
# ['zhangsan', 'Math', 22, ['Hunan', 'Changsha'], 'lisi', 'zhangsan', 'Math', 22, ['Hunan', 'Changsha'], 'lisi']

tuple长度和遍历的使用同列表没有差别

字符串String

字符串关键字为str,是由一个或多个字符(字母,数字,符号)组成的不可改变的序列,可以是常量也可以是变量。注意python中不区分char类型.
创建

x1 = 'hello'
x2 = 'hello'

判断值是否相等

x1 == x2    # True

内存地址是否相等

x1 is x2    # False

查找

'x' in x1    # False
x1.find('llo')     # 2,返回子串第一次出现的位置,若子串不存在返回-1

取出单个字符串

x1[0]    # 'h'

合并:将两个字符串表示通过指定分隔符合并

x3 = '|'.join([x1, x2])    # 'hello hello'
x3 = x1 + x2 # 前提是x1和x2都是字符串,否则会报错

拆分:将字符串以指定分隔符拆分,返回拆分后的列表

splist_list = x3.split('|')

倒序

''.join(reversed('hello'))
# 或
s = 'hello'[::-1]

统计子串出现次数

x.count('l')

格式化

'my name is {0}'.format('hyjz')

以及一些快速判断类型的方法:

str.isalnum()    # 是否全为字母或数字
str.isalpha()    # 是否全为字母
str.islower()    # 小写
str.isnumeric()    # 数字
str.isspace()    # 空格
str.istitle()    # 是否是标题化的
str.isupper()    # 大写

字典Dictionary

字典由键值对组成,键值唯一;与列表不同,键值对存储时是无序的.
创建

detaildict = {}

修改或添加

detaildict['fire'] = 'a fire'
detaildict['water'] = 'a water'
detaildict['thunder'] = 'a thunder'
detaildict['noname'] = 'noname'

删除键值对

del detaildict['noname']    # 若该键值不存在则会报错

遍历

# 遍历键值对
for magic, detail in detaildict.items():
    print(magic, detail)

# 遍历键
for magic in detaildict:
    print(magic)
# 等价于
for magic in detaildict.keys():
    print(magic)

# 其它常用遍历
for detail in detaildict.values()    # 按值遍历
    print(detail)
for magic in iter(detaildict)    # 使用迭代器遍历
    print(detaildict[magic])

是否包含键值

'fire' in detaildict    # True

根据值找键

list = [k for k,v in d.items() if v == value]
# {'a':'001', 'b':'002'} => ['a']

集合Set

集合是一种无序元素不重复的容器;集合间可以计算联合、交集、差集、对称差集等。
创建

set1 = set(['a', 'b', 'c', 'd', 'e'])
set2 = set(['a', 'b', 'x', 'y', 'z'])

添加

set1.add('f')

添加多项,重复的元素不会被加入

set1.update(['f', 'g'])

移除

set1.discard('a')
set1.remove('a')    # 若元素不存在会报错

集合运算

set_a = set1 | set2 # 并集
set_b = set1 & set2 # 交集
set_c = set1 - set2 # 差集(项在set1中且不再set2中)
set_d = set1 ^ set2 # 对称差集(项在set1或set2中,且不会同时出现在两者中)

浅拷贝

set3 = set1.copy()

是否是父子集合

set1.issubset(set3) # set1 <= set3,即是否set1所有元素都在set3中
set1.issuperset(set3) # set1 >= set3,即是否set3所有元素都在set1中
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值