基本数据类型
可迭代数据类型
通用操作:
- 遍历
- max
- min
- sum
- len
- 成员测试 in、not in
序列数据类型
通用操作:
- 索引
- 切片
- index
- count
- 同类型加法拼接
- 整数乘法重复
字符串
不可变数据类型(对字符串的所有修改操作,都是返回一个新的字符串)
特有操作:
s.upper()s.lower()s.replace(sub1, sub2)s.join(Iterable[str])s.format()s.split(c)
元组
不可变数据类型,基本是拿来用索引,或者切片
列表
可变数据类型
特有操作:
-
通过索引进行修改
-
通过切片进行修改
-
ls.append(x) -
del ls[i] i为元素索引
-
ls.remove(x)x为元素值 -
ls.extend(lt2) -
ls.insert(i, x) -
ls.reverse() -
ls.clear() -
列表表达式
集合 & 字典
集合中的元素、字典的键 都必须为不可变数据类型,不能重复
如果直接对字典进行for循环的遍历,那么出来的是字典的键
集合的特有方法:
s.pop()弹出集合s中的一个元素s.add(x)将x添加到集合s中s.remove(x)删除集合s中的元素x,x不存在则出错s.discard(x)删除集合s中的元素x,x不存在不出错s.update(t)将集合t合并到集合s中s.clear()清空集合ss-t差集s&t交集s|t并集s^t并集减去交集s.isdisjoint(t)判断是否相交 比较操作 判断包含关系
字典的特有方法:
-
通过键进行索引
-
d.keys()所有键的迭代器 -
d.values()所有值的迭代器 -
d.items()所有键值对的迭代器 -
d.get(key, default)如果key存在,返回d[key],否则返回default -
d.pop(key, default)返回d.get(key, default)并不出错的删除key -
d.popitem() -
d.update(d2)
列表表达式
一般我们使用的列表长这样
ls = [123,456,789,0]但是Python里面有个东西叫做列表表达式,例如
ls1 = [i for i in range(0,100)]这会生成一个带有0-99的int数据类型的列表,非常简洁
列表的排序
一般来说,你自己在Python里面写的对列表进行排序的函数,都不如内置的list().sort(*, key=key, reverse=False)要快,谁让人家是C语言写的排序呢……
但是list().sort()有个坑,我前两天帮人数学建模的时候还是踩进了这个坑,就是:这个方法是直接作用于列表本身,没有返回值的,所以进行赋值的时候就会变成none
例题1
下面的列表a是人物的名字,b是他们对应的年龄,请输出18岁以下的人物并根据他们的年龄进行升序排列
a = ['tom', 'iron man','jerry', 'donald', 'micky', 'spider man']b = [3, 32, 1, 8, 2, 19]我的做法是用多一个列表,往里面用元组的形式填他们的名字以及年龄信息
ls = []
for i in a: pos = a.index(i) age = b[pos] if age < 18: ls.append((i,age))对ls进行打印,得出这样的一个列表
[('tom', 3), ('jerry', 1), ('donald', 8), ('micky', 2)]再通过sort函数和lambda表达式进行排序,对所需要的东西进行打印
ls.sort(key=lambda x: x[1])for i in ls: print(i[0])输出为
jerrymickytomdonald但是经过教员的提醒,还有个zip()函数可以直接把两个列表中的对应位置的元素合在一起变成元组
items = list(zip(a,b))这样做的结果跟上面的ls的结果是一样的
然后再在列表表达式里面筛选,两步可以合在一起
items = [item for item in list(zip(a,b)) if item[1] < 18]for i in items: print(i[0])启示:少用字典,筛选放在后面去
例题2
2089. 找出数组排序后的目标下标 - 力扣(LeetCode)
我的题解:
class Solution: def targetIndices(self, nums: List[int], target: int) -> List[int]: nums.sort() result = [] for i in range(0,len(nums)): if nums[i] == target: result.append(i) return result优化版(因为找到了以后,再往后就不存在要找的了,所以可以直接break掉)
class Solution: def targetIndices(self, nums: List[int], target: int) -> List[int]: nums.sort() result = [] found = False for i in range(0,len(nums)): if nums[i] == target: result.append(i) if nums[i] != target and found: break return result例题3
我的题解:
class Solution: def findDifference(self, nums1: List[int], nums2: List[int]) -> List[List[int]]: answer = [[],[]] for i in nums1: if i not in nums2 and i not in answer[0]: answer[0].append(i) for i in nums2: if i not in nums1 and i not in answer[1]: answer[1].append(i) return answer优化版(找不同的可以用集合去做):
class Solution: def findDifference(self, nums1: List[int], nums2: List[int]) -> List[List[int]]: s1 = set(nums1) s2 = set(nums2) answer = [[],[]] answer[0] = list(s1-s2) answer[1] = list(s2-s1) return answer例题4
599. 两个列表的最小索引总和 - 力扣(LeetCode)
我的题解:
class Solution: def findRestaurant(self, list1: List[str], list2: List[str]) -> List[str]: lovedRest = [] for i in list1: if i in list2: indexSum = list1.index(i) + list2.index(i) lovedRest.append((i,indexSum)) lovedRest.sort(key=lambda x: x[1]) result = [] result.append(lovedRest[0][0]) for i in range(1,len(lovedRest)): if lovedRest[i][1] == lovedRest[0][1]: result.append(lovedRest[i][0]) else: break return resultenumerate(list)在遍历的过程中出现index, value的返回值,可以在for循环使用,例如
...(上面已经定义了ls为列表)for i, value in enumerate(ls): pass所以上面这一题也可以改一改,用这个方法可以免去用ls.index()的麻烦
例题5
2200. 找出数组中的所有 K 近邻下标 - 力扣(LeetCode)
我的题解(OT了):
class Solution: def abs(num): if num < 0: return num*-1 else: return num def findKDistantIndices(self, nums: List[int], key: int, k: int) -> List[int]: keyPos = [i for i in range(0,len(nums)) if nums[i] == key] result = [] for pos in keyPos: for i in range(0,len(nums)): if abs(i-pos)<=k and i not in result: result.append(i) else: pass result.sort() return result优化版:
思路是从i所在位置往左往右k个位置是否有key,如果有的话就进行计算,没有就跳过,省去了很多遍历
class Solution: def findKDistantIndices(self, nums: List[int], key: int, k: int) -> List[int]: result = [] for i in range(len(nums)): if key in nums[max(0,i-k):i+k+1]: result.append(i) return result列表的空间
列表在内存中是连续的,但是如果要用申请的空间之外的地方的话(即加长列表)就要再次申请,会减慢运行,所以可以先申请一大片空间
ls = [0]*1000