python 字典结构中的奇怪语法 - 你能解释一下吗?
Strange syntax in python dictionary construction - can you explain?
我在看别人的 Python 代码,看到下面的表达式:
dp = defaultdict(lambda: inf, {(): 0})
这是什么意思?
我熟悉 defaultdict - defaultdict(lambda: inf)
会创建一个默认值为 inf 的字典。但是第二个参数: {(): 0}
呢?什么意思?
编辑:
我在 following code 中看到了这一行。所以,我想,我正试图了解这有什么用。作者没有回应,所以我试图了解使用这种语法的基本原理和潜在好处。
EDIT2:我意识到这一行等同于
dp = defaultdict(lambda: 0)
dp[()] = 0
这种语法的主要优点是它的短小 - 它在一行代码中完成。我只是不知道您可以定义一个 defaultdict 并同时,在其中添加一个条目。
现在,构造函数中的第二个参数(使用空元组作为字典条目的键)仍然不常见。但这只是一个奇怪的选择 - 这种语法本身并没有什么新东西。
PS。我接受了 Patrick 的 post,即使它没有提供我正在寻找的确切答案。还是给了我一些指导。
它创建了一个包含 (item:inf, {():0})
元组的默认字典?
为什么不简单地添加一项并亲自查看?
from collections import defaultdict
from math import inf
dp = defaultdict(lambda: inf, {(): 0})
dp[42]
print(dp)
输出:
defaultdict(<function <lambda> at 0x7f5b389a7e18>, {(): 0, 42: inf})
在助手调用
中添加了打印语句 this
from collections import Counter, defaultdict
from math import inf, isinf
from pprint import pprint
class Solution(object):
def minStickers(self, stickers, target):
s_cnts = *map(Counter, stickers),
dp = defaultdict(lambda: inf, {(): 0})
def helper(cnt):
_id = tuple(cnt.items())
if isinf(dp[_id]):
dp[_id] = 1 + min((helper(cnt - s_cnt) for s_cnt in s_cnts
if s_cnt[_id[0][0]]), default=inf)
pprint(dp)
return dp[_id]
# no python 3.8 available, replaced walrussoperator
return -1 if isinf( helper(Counter(target))) else helper(Counter(target))
s = Solution()
print(s.minStickers(["with", "example", "science"], "thehat"))
导致
defaultdict(<function Solution.minStickers.<locals>.<lambda> at 0x03A4C4F8>,
{(): 0,
(('e', 1), ('a', 1)): inf,
(('t', 1), ('h', 1), ('e', 1), ('a', 1)): inf,
(('t', 2), ('h', 2), ('e', 1), ('a', 1)): inf})
defaultdict(<function Solution.minStickers.<locals>.<lambda> at 0x03A4C4F8>,
{(): 0,
(('a', 1),): inf,
(('e', 1), ('a', 1)): inf,
(('t', 1), ('h', 1), ('e', 1), ('a', 1)): inf,
(('t', 2), ('h', 2), ('e', 1), ('a', 1)): inf})
defaultdict(<function Solution.minStickers.<locals>.<lambda> at 0x03A4C4F8>,
{(): 0,
(('a', 1),): 1,
(('e', 1), ('a', 1)): inf,
(('t', 1), ('h', 1), ('e', 1), ('a', 1)): inf,
(('t', 2), ('h', 2), ('e', 1), ('a', 1)): inf})
defaultdict(<function Solution.minStickers.<locals>.<lambda> at 0x03A4C4F8>,
{(): 0,
(('a', 1),): 1,
(('e', 1), ('a', 1)): 1,
(('t', 1), ('h', 1), ('e', 1), ('a', 1)): inf,
(('t', 2), ('h', 2), ('e', 1), ('a', 1)): inf})
defaultdict(<function Solution.minStickers.<locals>.<lambda> at 0x03A4C4F8>,
{(): 0,
The thread 'MainThread' (0x1) has exited with code 0 (0x0).
(('a', 1),): 1,
(('e', 1), ('a', 1)): 1,
(('t', 1), ('h', 1), ('e', 1), ('a', 1)): 2,
(('t', 2), ('h', 2), ('e', 1), ('a', 1)): inf})
defaultdict(<function Solution.minStickers.<locals>.<lambda> at 0x03A4C4F8>,
{(): 0,
(('a', 1),): 1,
(('e', 1), ('a', 1)): 1,
(('t', 1), ('h', 1), ('e', 1), ('a', 1)): 2,
(('t', 2), ('h', 2), ('e', 1), ('a', 1)): 3})
我在看别人的 Python 代码,看到下面的表达式:
dp = defaultdict(lambda: inf, {(): 0})
这是什么意思?
我熟悉 defaultdict - defaultdict(lambda: inf)
会创建一个默认值为 inf 的字典。但是第二个参数: {(): 0}
呢?什么意思?
编辑:
我在 following code 中看到了这一行。所以,我想,我正试图了解这有什么用。作者没有回应,所以我试图了解使用这种语法的基本原理和潜在好处。
EDIT2:我意识到这一行等同于
dp = defaultdict(lambda: 0)
dp[()] = 0
这种语法的主要优点是它的短小 - 它在一行代码中完成。我只是不知道您可以定义一个 defaultdict 并同时,在其中添加一个条目。
现在,构造函数中的第二个参数(使用空元组作为字典条目的键)仍然不常见。但这只是一个奇怪的选择 - 这种语法本身并没有什么新东西。
PS。我接受了 Patrick 的 post,即使它没有提供我正在寻找的确切答案。还是给了我一些指导。
它创建了一个包含 (item:inf, {():0})
元组的默认字典?
为什么不简单地添加一项并亲自查看?
from collections import defaultdict
from math import inf
dp = defaultdict(lambda: inf, {(): 0})
dp[42]
print(dp)
输出:
defaultdict(<function <lambda> at 0x7f5b389a7e18>, {(): 0, 42: inf})
在助手调用
中添加了打印语句 thisfrom collections import Counter, defaultdict
from math import inf, isinf
from pprint import pprint
class Solution(object):
def minStickers(self, stickers, target):
s_cnts = *map(Counter, stickers),
dp = defaultdict(lambda: inf, {(): 0})
def helper(cnt):
_id = tuple(cnt.items())
if isinf(dp[_id]):
dp[_id] = 1 + min((helper(cnt - s_cnt) for s_cnt in s_cnts
if s_cnt[_id[0][0]]), default=inf)
pprint(dp)
return dp[_id]
# no python 3.8 available, replaced walrussoperator
return -1 if isinf( helper(Counter(target))) else helper(Counter(target))
s = Solution()
print(s.minStickers(["with", "example", "science"], "thehat"))
导致
defaultdict(<function Solution.minStickers.<locals>.<lambda> at 0x03A4C4F8>,
{(): 0,
(('e', 1), ('a', 1)): inf,
(('t', 1), ('h', 1), ('e', 1), ('a', 1)): inf,
(('t', 2), ('h', 2), ('e', 1), ('a', 1)): inf})
defaultdict(<function Solution.minStickers.<locals>.<lambda> at 0x03A4C4F8>,
{(): 0,
(('a', 1),): inf,
(('e', 1), ('a', 1)): inf,
(('t', 1), ('h', 1), ('e', 1), ('a', 1)): inf,
(('t', 2), ('h', 2), ('e', 1), ('a', 1)): inf})
defaultdict(<function Solution.minStickers.<locals>.<lambda> at 0x03A4C4F8>,
{(): 0,
(('a', 1),): 1,
(('e', 1), ('a', 1)): inf,
(('t', 1), ('h', 1), ('e', 1), ('a', 1)): inf,
(('t', 2), ('h', 2), ('e', 1), ('a', 1)): inf})
defaultdict(<function Solution.minStickers.<locals>.<lambda> at 0x03A4C4F8>,
{(): 0,
(('a', 1),): 1,
(('e', 1), ('a', 1)): 1,
(('t', 1), ('h', 1), ('e', 1), ('a', 1)): inf,
(('t', 2), ('h', 2), ('e', 1), ('a', 1)): inf})
defaultdict(<function Solution.minStickers.<locals>.<lambda> at 0x03A4C4F8>,
{(): 0,
The thread 'MainThread' (0x1) has exited with code 0 (0x0).
(('a', 1),): 1,
(('e', 1), ('a', 1)): 1,
(('t', 1), ('h', 1), ('e', 1), ('a', 1)): 2,
(('t', 2), ('h', 2), ('e', 1), ('a', 1)): inf})
defaultdict(<function Solution.minStickers.<locals>.<lambda> at 0x03A4C4F8>,
{(): 0,
(('a', 1),): 1,
(('e', 1), ('a', 1)): 1,
(('t', 1), ('h', 1), ('e', 1), ('a', 1)): 2,
(('t', 2), ('h', 2), ('e', 1), ('a', 1)): 3})