Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用元组作为键的defaultdict,如何在事件键中设置默认值是';找不到_Python_Dictionary_Tuples_Defaultdict - Fatal编程技术网

Python 使用元组作为键的defaultdict,如何在事件键中设置默认值是';找不到

Python 使用元组作为键的defaultdict,如何在事件键中设置默认值是';找不到,python,dictionary,tuples,defaultdict,Python,Dictionary,Tuples,Defaultdict,假设我有一个defaultdict格式如下: theta = defaultdict(float) 键由字符串元组组成,即(标签,单词),关联值是给定单词符合给定标签的概率(词性标记) 例如,单词“stand”可以是名词或动词。所以我可以这样做: theta[('NOUN', 'stand')] = 0.4 theta[('VERB', 'stand')] = 0.6 theta[('ADJ', 'stand')] = 0.0 等等,用于语音标签的其余部分 我需要做的是,如果使用字典不包含的

假设我有一个
defaultdict
格式如下:

theta = defaultdict(float)
键由字符串元组组成,即
(标签,单词)
,关联值是给定单词符合给定标签的概率(词性标记)

例如,单词“stand”可以是名词或动词。所以我可以这样做:

theta[('NOUN', 'stand')] = 0.4
theta[('VERB', 'stand')] = 0.6
theta[('ADJ', 'stand')] = 0.0
等等,用于语音标签的其余部分

我需要做的是,如果使用字典不包含的单词调用字典,并且关联的标签为“NOUN”,那么字典在默认情况下返回值1,对于所有其他关联的标签,返回0。例如:

value = theta[('NOUN', 'wordthatdoesntexist')]  # this should be 1
value = theta[('VERB', 'wordthatdoesntexist')]  # this should be 0

我该怎么做?我可以在初始化步骤中使用lambda完成吗?或者有其他方法吗?

默认dict无法做到这一点;默认工厂无权访问密钥。您必须编写自己的dict子类,在尝试访问缺少的键时,使用
\uuuuuu missing\uuuu
hook dict查找:

class SomeAppropriateName(dict):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
    def __missing__(self, key):
        val = 1.0 if key[0] == 'NOUN' else 0.0
        # Uncomment the following line if you want to add the value to the dict
        # self[key] = val
        return val

defaultdict不能这样做;默认工厂无权访问密钥。您必须编写自己的dict子类,在尝试访问缺少的键时,使用
\uuuuuu missing\uuuu
hook dict查找:

class SomeAppropriateName(dict):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
    def __missing__(self, key):
        val = 1.0 if key[0] == 'NOUN' else 0.0
        # Uncomment the following line if you want to add the value to the dict
        # self[key] = val
        return val

您可以使用dict的
setdefault()
方法:

d.setdefault(u, int(u[0] == "NOUN"))

如果在
d
中找到
u
,则setdefault返回
d[u]
。否则,它将插入dict中,其值作为第二个参数提供。

您可以使用
dict的
setdefault()
方法:

d.setdefault(u, int(u[0] == "NOUN"))

如果在
d
中找到
u
,则setdefault返回
d[u]
。否则,它将被插入到dict中,其值作为第二个参数提供。

您需要某种类型的检查词“word exists”,至少在伪代码中。@pvg:我不确定您的意思。你是说我需要一个明确的检查来处理self
案例中的
键吗<代码>\uuuu缺失\uuuu
不会因为这种情况而被调用。重新阅读它时,我想我的意思是“单词不存在”没有得到很好的定义。它是否表示“不作为任何键的一部分存在”或“此词性/词性对不存在”?但看起来像是问问题的人把问题解决了。@pvg:说得好。如果
('VERB','foo')
已经作为值为
0.5
的键存在,那么访问
('noon','foo')
的默认值为
1.0
可能是一件坏事。我认为找出正确的方法需要比我们有更多的上下文,而且可能比dict有更多的上下文。你需要某种检查词“word exists”,至少在伪代码中。@pvg:我不确定你的意思。你是说我需要一个明确的检查来处理self案例中的
键吗<代码>\uuuu缺失\uuuu
不会因为这种情况而被调用。重新阅读它时,我想我的意思是“单词不存在”没有得到很好的定义。它是否表示“不作为任何键的一部分存在”或“此词性/词性对不存在”?但看起来像是问问题的人把问题解决了。@pvg:说得好。如果
('VERB','foo')
已经作为值为
0.5
的键存在,那么访问
('noon','foo')
的默认值为
1.0
可能是一件坏事。我认为,找出正确的做法需要比我们有更多的背景,可能比《格言》有更多的背景。