当前位置: 首页 > 面试题库 >

在python中创建默认列表

南门峰
2023-03-14
问题内容

我正在尝试创建一个非常有用的等效列表collections.defaultdict。以下设计效果很好:

class defaultlist(list):
    def __init__(self, fx):
        self._fx = fx
    def __setitem__(self, index, value):
        while len(self) <= index:
            self.append(self._fx())
        list.__setitem__(self, index, value)

使用方法如下:

>>> dl = defaultlist(lambda:'A')
>>> dl[2]='B'
>>> dl[4]='C'
>>> dl
['A', 'A', 'B', 'A', 'C']

我应该添加什么到默认列表中以支持以下行为?

>>> dl = defaultlist(dict)
>>> dl[2]['a'] = 1
>>> dl
[{}, {}, {'a':1}]

问题答案:

在给出的示例中,您首先尝试检索列表中不存在的值,就像这样做一样dl[2]['a'],Python首先检索列表中的第三个(索引2)元素,然后继续在该列表中获取名为“
a”的元素对象-因此,您还必须实现对__getitem__方法的自动扩展行为,如下所示:

class defaultlist(list):
    def __init__(self, fx):
        self._fx = fx
    def _fill(self, index):
        while len(self) <= index:
            self.append(self._fx())
    def __setitem__(self, index, value):
        self._fill(index)
        list.__setitem__(self, index, value)
    def __getitem__(self, index):
        self._fill(index)
        return list.__getitem__(self, index)


 类似资料:
  • 对MongoDB来说相当陌生。在查文件。 https://docs.MongoDB.com/manual/reference/method/db.collection.insert/#id-field 如果文档没有指定_id字段,那么MongoDB将添加_id字段,并在插入之前为文档分配唯一的ObjectId。大多数驱动程序创建ObjectId并插入_id字段,但是如果驱动程序或应用程序不创建_i

  • 问题内容: 我正在尝试执行此操作,但是MySQL似乎不允许我这样做。是否有解决此问题的方法,或者我希望总是在我的INSERT查询中包括该函数? 我知道可以接受CURRENT_TIMESTAMP缺省值的TIMESTAMP类型,但是我的客户端坚持使用数据库中的纪元时间。 问题答案: MySQL实现数据类型的方式,实际上是将纪元时间存储在数据库中。因此,如果您想将其显示为int,则可以使用默认值为的列并

  • 当我第一次部署应用程序时,它将在我的数据库中创建这个表。 我的问题是:有没有办法在创建表时,用firstname和它一起创建一个管理用户?

  • 如果我注释掉第二个alter table,它可以工作,因为数据是插入的。 完整错误为:Fiddle显示错误的默认值无效:https://dbfiddle.uk/?rdbms=mysql_8.0&Fiddle=2df3b421793a7470a321247abec85b47

  • 问题内容: 在Python中创建新的空列表的最佳方法是什么? 要么 我之所以这样问是因为两个原因: 技术原因,关于哪个更快。(创建一个类会导致开销吗?) 代码可读性-这是标准约定。 问题答案: 您可以通过以下方法测试哪段代码更快: 但是,实际上,这种初始化很可能只是程序的一小部分,因此担心此初始化可能会出错。 可读性非常主观。我更喜欢,但是像AlexMartelli这样的一些非常博学的人更喜欢,因

  • 问题内容: 如何创建以下注释的实例(所有字段均设置为其默认值)。 我试过了,但这似乎不起作用… 问题答案: 您无法创建实例,但至少要获取默认值 然后,可以使用动态代理返回默认值。据我所知,这也是Java本身处理批注的方式。