【问题标题】:Sparse assignment list in pythonpython中的稀疏分配列表
【发布时间】:2009-12-07 04:20:43
【问题描述】:

我需要一个具有以下行为的列表

>>> l = SparseList()
>>> l
[]
>>> l[2] = "hello"
>>> l
[ None, None, "hello"]
>>> l[5]
None
>>> l[4] = 22
>>> l
[ None, None, "hello", None, 22]
>>> len(l)
5
>>> for i in l: print i
None
None
"hello"
None
22

虽然它可以通过字典“模拟”,但并不完全相同。 numpy 数组可以以这种方式运行,但我不想为这样的东西导入整个 numpy。在自己编写代码之前,我会询问标准库中是否存在类似的东西。

【问题讨论】:

    标签: python


    【解决方案1】:

    这是传递给定示例的最少代码(具有必不可少的调整:您希望奇怪的间距和引号,在没有print 语句的提示下打印出“无”等):

    class SparseList(list):
      def __setitem__(self, index, value):
        missing = index - len(self) + 1
        if missing > 0:
          self.extend([None] * missing)
        list.__setitem__(self, index, value)
      def __getitem__(self, index):
        try: return list.__getitem__(self, index)
        except IndexError: return None
    
    __test__ = dict(allem='''
    >>> l = SparseList()
    >>> l
    []
    >>> l[2] = "hello"
    >>> l
    [None, None, 'hello']
    >>> print l[5]
    None
    >>> l[4] = 22
    >>> l
    [None, None, 'hello', None, 22]
    >>> len(l)
    5
    >>> for i in l: print i
    None
    None
    hello
    None
    22
    ''')
    import doctest
    doctest.testmod(verbose=1)
    

    我想你会想要更多(支持负索引、切片和其他任何东西),但这是你所有的例子都隐含地指定。

    【讨论】:

    • 但是,这意味着它在标准库中不存在...我可以将您的代码包含在 wavemol (BSD) 库中吗?
    • @Stefano,当然,请参阅meta.stackexchange.com/questions/13976/…:“用户贡献的内容在 cc-wiki 下获得许可,需要注明出处”(我相信 BSD 许可证与那个兼容,但我'如果需要,我们很乐意将其重新授权给您!-)。
    • Python 列表会自动为此优化空间吗?
    • 一些测试表明他们没有,所以虽然这符合 OP 的规定要求,但它不符合稀疏数组的通常期望。
    【解决方案2】:

    字典可以用作稀疏列表。 虽然它们不会提供您所追求的特征(因为您实际上不是在稀疏列表之后,所有列表元素都是对动态大小数组中 None 的完整引用),但它们充当教科书稀疏数组。

    sparse_vars = [(0,"Hi"), (10000,"Bye"), (20000,"Try")]
    sparse_list = {}
    
    for var in sparse_vars:
      sparse_list[var[0]] = var[1]
    
    >>> print sparse_list
    {0: 'Hi', 10000: 'Bye', 20000: 'Try'}
    >>> print sparse_list[20000]
    'Try'
    

    【讨论】:

    • 如果您需要遍历稀疏数组项并且顺序很重要,那么基于字典的解决方案将效率低下
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-11
    • 2018-08-07
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多