python 中的 字典表达式
背景
列表中的元素 充当 字典中的 key
0 用来 充当 列表中的 value
M1: 使用两个for循环
l = [1, 2, 2, 3, 3, 4, 4, 5]
dic = {}
for k in l:
for v in [0]: ## 注意这里可以是一个长度大于1的列表
dic[k] = v
print(dic)
结果:
{1: 0, 2: 0, 3: 0, 4: 0, 5: 0}
M2:使用 一个 for
l = [1, 2, 2, 3, 3, 4, 4, 5]
dic = {}
v = 0
for k in l:
dic[k] = v
print(dic)
结果:
{1: 0, 2: 0, 3: 0, 4: 0, 5: 0}
M3:使用 字典表达式
通过 M1 简化得到
l = [1, 2, 2, 3, 3, 4, 4, 5]
dic = {k:v for k in l for v in [0]}
print(dic)
通过M2简化得到
l = [1, 2, 2, 3, 3, 4, 4, 5]
v = 0
dic = {k:v for k in l}
M4:通过zip函数完成
l = [1, 2, 2, 3, 3, 4, 4, 5]
zeros = [0 for i in range(len(l))]
dic = dict(zip(l, zeros))
总体程序 – 删除有序链表中重复的元素
题目解答:
统计链表中出现元素的个数,然后取出元素小于等于1的情况,然后再重新合并成链表
使用的数据结构为字典 ,链表
注意: 这里我并没有考虑有序的使用,下面的代码同样适用于无序情况
class ListNode:
def __init__(self, x):
self.val = x
self.next = None
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
#
# @param head ListNode类
# @return ListNode类
#
# from collections import defaultdict
class Solution:
def deleteDuplicates(self , head: ListNode) -> ListNode:
# write code here
# 判断空链表和单值链表
if not head or not head.next:
return head
# 通过列表生成链表
l = []
cur = head
while cur:
l.append(cur.val)
cur = cur.next
## 初试化字典
v = 0
dic = {k:v for k in l}
## 统计数值的频次
for i in l:
dic[i] += 1
## 生成新的列表。这里已经去除了多次出现的数据
l = []
for k, v in dic.items():
if v <= 1:
l.append(k)
# 通过列表生成链表
res = head = ListNode(0) ## 设置头结点,省去了条件判断
for i in range(0, len(l)):
res.next = ListNode(l[i])
res = res.next
return head.next
优化1: 使用 collections.Counter完成数据频次的统计
## 初试化字典
v = 0
dic = {k:v for k in l}
## 统计数值的频次
for i in l:
dic[i] += 1
优化成:
import collections
dic = collections.Counter(l)
遍历字典:
for k, v in dic.items():
print(k, v)
优化2: 通过列表生成式 替代循环操作
## 生成新的列表。这里已经去除了多次出现的数据
l = []
for k, v in dic.items():
if v <= 1:
l.append(k)
优化为:
l = [k for k,v in dic.items() if v <= 1]
优化后的代码:
class ListNode:
def __init__(self, x):
self.val = x
self.next = None
class Solution:
def deleteDuplicates(self , head: ListNode) -> ListNode:
# write code here
# 判断空链表和单值链表
if not head or not head.next:
return head
# 通过列表生成链表
l = []
cur = head
while cur:
l.append(cur.val)
cur = cur.next
## 初试化 带有频次的字典
import collections
dic = collections.Counter(l)
## 列表生成式
l = [k for k,v in dic.items() if v <= 1]
# 通过列表生成链表
res = head = ListNode(0) ## 设置头结点,省去了条件判断
for i in range(0, len(l)):
res.next = ListNode(l[i])
res = res.next
return head.next
如果还有优化的地方,可以在下方评论说一下,我学习学习。