python | defaultdict用法详解

简介

今天做力扣每日一题,判断是否是有效的数独时,按照每个条件查找一次的情况来分析,耗时较长。
从官方题解中看到这样一句话,可以分别按照三种情况(判断数独是否合理的三个条件)有效的保存每个元素出现的次数。
记录并学习一下它的用法。

record = {0: defaultdict(set), 1: defaultdict(set), 2: defaultdict(set)}

力扣第36题

题目

力扣第36题:有效的数独

请你判断一个 9x9 的数独是否有效。只需要 根据以下规则 ,验证已经填入的数字是否有效即可。

数字 1-9 在每一行只能出现一次。
数字 1-9 在每一列只能出现一次。
数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例图)
数独部分空格内已填入了数字,空白格用 ‘.’ 表示。

注意:
一个有效的数独(部分已被填充)不一定是可解的。
只需要根据以上规则,验证已经填入的数字是否有效即可。

分析

1. 双重遍历,按每个条件查找

class Solution:
    def isValidSudoku(self, board: List[List[str]]) -> bool:
        import numpy as np
        board = np.array(board)
        for i in range(9):
            hang = board[i,:]
            for j in range(9):
                for k in range(9):
                    if hang[k] == hang[j] and hang[k] != '.' and k != j:
                        return 0>1

            lie = board[:,i]
            for j in range(9):
                for k in range(9):
                    if lie[k] == lie[j] and lie[k] != '.' and k != j:
                        return 0>1


        for i in range(3):
            for j in range(3):
                test = board[3*i:(3*i+3),(3*j):(3*j+3)]
                test = np.reshape(test,(9,1))
                for j in range(9):
                    for k in range(9):
                        if test[k] == test[j] and test[k] != '.' and k != j:
                            return 0>1

        return 1>0

2. 遍历一次,记录每个元素出现的次数


from collections import defaultdict
import math
def isValidSudok(board):
    # 0: row, 1: column, 2: square
    record = {0: defaultdict(set), 1: defaultdict(set), 2: defaultdict(set)}
    n = len(board)
    m = math.sqrt(n)
    for i in range(n):
        for j in range(n):
            if board[i][j] == '.':
                continue
            if board[i][j] in record[0][i] or board[i][j] in record[1][j]:
                return False
            sq = i // m * m + j // m
            if board[i][j] in record[2][sq]:
                return False
            record[0][i].add(board[i][j])
            record[1][j].add(board[i][j])
            record[2][sq].add(board[i][j])
    return True


board = [[".",".",".",".","5",".",".","1","."],[".","4",".","3",".",".",".",".","."],[".",".",".",".",".","3",".",".","1"],["8",".",".",".",".",".",".","2","."],[".",".","2",".","7",".",".",".","."],[".","1","5",".",".",".",".",".","."],[".",".",".",".",".","2",".",".","."],[".","2",".","9",".",".",".",".","."],[".",".","4",".",".",".",".",".","."]]

res = isValidSudok(board)
print(res)

总结

转摘:python中defaultdict用法详解

defaultdict与普通的字典的区别

当我使用普通的字典时,用法一般是dict={},添加元素的只需要dict[element] =value即,调用的时候也是如此,dict[element] = xxx,但前提是element字典里,如果不在字典里就会报错,如:

在这里插入图片描述
这时defaultdict就能排上用场了,defaultdict的作用是在于,当字典里的key不存在但被查找时,返回的不是keyError而是一个默认值。

如何使用defaultdict

defaultdict接受一个工厂函数作为参数,如下来构造:

dict = defaultdict( factory_function)

这个factory_function可以是list、set、str等等,作用是当key不存在时,返回的是工厂函数的默认值,比如list对应[ ],str对应的是空字符串,set对应set( ),int对应0.

举例:

from collections import defaultdict

dict1 = defaultdict(int)
dict2 = defaultdict(set)
dict3 = defaultdict(str)
dict4 = defaultdict(list)
dict1[2] ='two'

print(dict1[1])
print(dict2[1])
print(dict3[1])
print(dict4[1])

输出:

0
set()

[]

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Pythondefaultdict是一种字典的子类,它在创建时会指定一个默认值的类型,当我们访问字典中不存在的键时,它不会引发KeyError报错,而是返回该默认值。这对于处理字典中不存在的键非常方便。 下面是一个使用defaultdict的案例: ```python from collections import defaultdict # 创建一个defaultdict,默认值为int类型(默认值为0) d = defaultdict(int) # 访问不存在的键 print(d['a']) # 输出 0 # 添加元素 d['b'] = 10 d['c'] += 1 # 输出字典 print(d) # 输出 defaultdict(<class 'int'>, {'a': 0, 'b': 10, 'c': 1}) ``` 在上面的例子中,我们创建了一个默认值为int类型(默认值为0)的defaultdict。当访问字典中不存在的键'a'时,它会返回默认值0,而不会引发KeyError报错。我们还可以像普通字典一样添加和修改元素。 另外,defaultdict还可以与其他数据类型一起使用,比如list、set等,以满足不同的需求。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [python - 内置类型 之 dict字典](https://blog.csdn.net/helunqu2017/article/details/116348007)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值