如果索引不存在,Python列表将在索引处设置值
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或这个快速的小家伙:
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
,并且失败。任何多维的解决方案都有一个问题,那就是它不能读懂思想。。。