提要
- 匿名函数:又名lambda函数,以lambda关键字起头,格式为:lambda 参数:表达式(返回体)
用法示例
lambda:x,y:x+y
#等价于
def test(x,y):
return x+y
- get()方法:用在字典上,格式为dic.get(key,[default_value])。用于获取键值,default_value可选,用在字典中没有key这个键的情况下返回的默认值。
用法示例
dic={"a":"b"}
test1=dic.get("a")
test2=dic.get("c",0)
#otput:test1=b,test2=0
- 过滤器:filter().用于过滤序列,过滤掉不符合条件的元素,返回由符合条件的元素组成的新列表。该函数接收两个参数,第一个为函数,第二个为序列,序列的每个元素作为参数传递给函数进行判断,然后返回True或False,最后将返回的True的元素放到新的列表中。
用法示例
a=[-1,-2,0,3,4]
b=filter(lambda x:x<0,a)
c=list(b)
#output:b=<filter object at 0x7f2ccd3e59b0>,c=[-1,-2]
#解释:可以看出第二行代码的作用是过滤掉大于或等于零的元素然后将列表赋值给b,可为什么b输出的结果是一串地址呢?因为序列经过过滤器的处理之后仅能得到一个filter对象,要得到真正的列表还需经过list()方法的处理。
#PS:若过滤器作用于字典,那么筛选的是键。
思路
- 理论
-
- 已知i+j+k=0,那么必有一个元素大于零而一个小于零,第三个不确定。可设i<0,j>=0。则可以推导:
-k = (i + j)即-k - i = j i<0 -> -k < j
-k = (i + j)即-k - j = i j>0 -> -k > i
综上,k<i或者k>j。
- 已知i+j+k=0,那么必有一个元素大于零而一个小于零,第三个不确定。可设i<0,j>=0。则可以推导:
- 步骤
-
- 将题目给出的列表哈希化,即将各个元素及其出现次数组成键值对,将键值对合成为字典。
-
- 将负数键和非负数键分别放入两个列表当中。
-
- 找出特殊情况(三个零),将其放入结果集中。
-
- 遍历拆分出来的两个列表,根据第一步推导的数学公式筛选符合条件的集合放入结果集。
推演
- nums={1,2,-1,0,0,0,-1}
- nums_dic={1:1,2:1,1:2,0:3}
- result=[[0,0,0]]
- ne=[-1],po=[1,2,0]
- i=-1,j=1->c=0 (0 in nums) (0 not in (i,j)) (0>i and 0<j) -> continue
- i=-1,j=2->c=-1 (-1 in nums) (-1 in (i,j)) nums_dic[-1]>=2 -> result=[[0,0,0],[-1,2,-1]]
- i=-1,j=0->c=1 (1 in nums) (1 not in (i,j)) (i>j) -> result=[[0,0,0],[-1,2,-1],[-1,0,1]]
示例
class Solution:
def threeSum(self, nums: List[int]) -> List[List[int]]:
result=[]#初始化结果集
nums_dic={}#初始化哈希表(模拟哈希,以字典形式存在)
for i in nums:
nums_dic[i]=nums_dic.get(i,0)+1#计算每个元素出现次数,和元素作为值键对传入哈希表。(给不存在的键赋值时,它们会作为新的键值对追加到字典中)
#根据键的正负将其过滤为两个列表
ne=list(filter(lambda x: x<0,nums_dic))
po=list(filter(lambda x: x>=0,nums_dic))
#获取特殊结果放入结果集
if 0 in nums_dic and nums_dic[0]>=3:
result.append([0,0,0])
#进入循环
for i in ne:
for j in po:
k=0-i-j
if k in nums_dic:
if k in (i,j):
if nums_dic[k]>=2:
result.append([i,j,k])
if k<i or k>j:
result.append([i,j,k])
return result