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))

总体程序 – 删除有序链表中重复的元素

题目链接:
https://www.nowcoder.com/practice/71cef9f8b5564579bf7ed93fbe0b2024?tpId=295&tqId=663&ru=/exam/oj&qru=/ta/format-top101/question-ranking&sourceUrl=%2Fexam%2Foj%3Ftab%3D%25E7%25AE%2597%25E6%25B3%2595%25E7%25AF%2587%26topicId%3D295
在这里插入图片描述

题目解答:

统计链表中出现元素的个数,然后取出元素小于等于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

如果还有优化的地方,可以在下方评论说一下,我学习学习。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值