簡體   English   中英

使用collections.defaultdict中的密鑰

[英]Using the key in collections.defaultdict

collections.defaultdict很棒。 特別是與lambda一起使用:

>>> import collections
>>> a = collections.defaultdict(lambda : [None,None])
>>> a['foo']
[None, None]

有沒有辦法在lambda中使用給定的鍵(例如'foo' )? 例如(不起作用):

>>> a = collections.defaultdict(lambda : [None]*key)
>>> a[1]
[None]
>>> a[2]
[None, None]
>>> a
defaultdict(<function <lambda> at 0x02984170>, {1: [None], 2: [None, None]})

您可能想要__missing__ ,只要您嘗試訪問dict中不存在的項目,就會在dict上調用它。 vanilla __missing__引發異常,但你可以在子類中做任何你喜歡的事情:

class A(dict):
    def __missing__(self, key):
        value = self[key] = [None] * key
        return value

結合SingleNegationEliminationrplnt以及defaultdict文檔的答案,我使用了以下解決方案。

import collections
class KeyBasedDefaultDict(collections.defaultdict):
    def __missing__(self, key):
        if self.default_factory is None:
            raise KeyError(key)
        self[key] = self.default_factory(key)
        return self[key]

該方法的主體可能只是return self.default_factory(key) ,但額外的代碼確保復制所有defaultdict行為。

使用情況如下所述:

d = KeyBasedDefaultDict(lambda key: [None] * key)
d[1]
> [None]
d[2]
> [None, None]

這將按要求工作,雖然它可能不是最好的解決方案(您需要使用默認調用初始化它,然后不使用它)。 它可能可以通過覆蓋其他一些方法來修復。

class NoneDict(collections.defaultdict):
    def __setitem__(self, key, value):
        super(NoneDict, self).__setitem__(key, key*[None])

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM