如果索引不存在,Python列表将在索引处设置值

如果索引不存在,Python列表将在索引处设置值,python,python-3.x,multidimensional-array,Python,Python 3.x,Multidimensional Array,python中是否有一种方法、库或其他东西可以在列表中设置不存在的索引的值? 类似于在列表中创建运行时索引: l = [] l[3] = 'foo' # [None, None, None, 'foo'] 更进一步,通过多维列表: l = [] l[0][2] = 'bar' # [[None, None, 'bar']] 或与现有的: l = [['xx']] l[0][1] = 'yy' # [['xx', 'yy']] 不能创建带有间隙的列表。你可以用一个dict或这个快速的小家伙:

python中是否有一种方法、库或其他东西可以在列表中设置不存在的索引的值? 类似于在列表中创建运行时索引:

l = []
l[3] = 'foo'
# [None, None, None, 'foo']
更进一步,通过多维列表:

l = []
l[0][2] = 'bar'
# [[None, None, 'bar']]
或与现有的:

l = [['xx']]
l[0][1] = 'yy'
# [['xx', 'yy']]

不能创建带有间隙的列表。你可以用一个
dict
或这个快速的小家伙:

def set_list(i,v):
    l = []
    x = 0
    while x < i:
        l.append(None)
        x += 1
    l.append(v)
    return l

print set_list(3, 'foo')
>>> [None, None, None, 'foo']
def set_列表(i,v):
l=[]
x=0
而x>>[无,无,无,'foo']

没有内置的,但很容易实现:

class FillList(list):
    def __setitem__(self, index, value):
        try:
            super().__setitem__(index, value)
        except IndexError:
            for _ in range(index-len(self)+1):
                self.append(None)
            super().__setitem__(index, value)
或者,如果您需要更改现有的常规列表:

def set_list(l, i, v):
      try:
          l[i] = v
      except IndexError:
          for _ in range(i-len(l)+1):
              l.append(None)
          l[i] = v

如果您真的想知道问题中的语法,
defaultdict
可能是最好的方法:

from collections import defaultdict
def rec_dd(): 
    return defaultdict(rec_dd)

l = rec_dd()
l[3] = 'foo'

print l
{3: 'foo'}

l = rec_dd()
l[0][2] = 'xx'
l[1][0] = 'yy'
print l
<long output because of defaultdict, but essentially)
{0: {2: 'xx'}, 1: {0: 'yy'}}
从集合导入defaultdict
def rec_dd():
返回defaultdict(rec_dd)
l=rec_dd()
l[3]=“foo”
打印l
{3:'foo'}
l=rec_dd()
l[0][2]=“xx”
l[1][0]=“yy”
打印l

不是万无一失的,但似乎最简单的方法是初始化一个比您需要的大得多的列表,即

l = [None for i in some_large_number]
l[3] = 'foo'
# [None, None, None, 'foo', None, None None ... ]

但是如果我想添加到现有列表中?比如:set_list(['a',b'],3,'foo')#['a',b',None,'foo']如果你在寻找像自动激活这样的东西,
def tree():return defaultdict(tree)
会给你一个dict,当你请求一个不存在的条目时,它会递归地生成新的dict。你为什么不能只使用dict?我看到的唯一区别是较低的索引被初始化为无。这很好,但我需要一个数组。你能演示如何在一个数组中转换它吗?如果你需要一个数组。。。您应该使用数组。但是,您可以对范围(10)中的索引执行
操作:在填充后执行(l[index])
,即,即使它看起来不像数组,但在大多数情况下,它的行为都类似于数组。如果
l[i]
不存在,您需要定义它的含义-这将创建一个空的
defaultdict
对象,但如果您看到了这一点,您的算法中可能已经存在一些错误。多维度很难。。。假设你做了一件你想做的事,如果它不存在,你想让它成为
l[i]
,那么
l[3]='three'
创建
[None,None,None,'three']
。但假设您随后执行了
l[0][3]
——当
l[0]
的查找完成时,代码不知道您想再次取消引用它,因此它不知道将
None
更改为
dict
,并且失败。任何多维的解决方案都有一个问题,那就是它不能读懂思想。。。