是否有一种方法,lib或python中的某些东西,我可以在不存在的索引处设置列表中的值?比如在list:
创建运行时索引l = []
l[3] = 'foo'
# [None, None, None, 'foo']
更进一步,使用多维列表:
l = []
l[0][2] = 'bar'
# [[None, None, 'bar']]
或使用已有的
l = [['xx']]
l[0][1] = 'yy'
# [['xx', 'yy']]
没有内置的,但是很容易实现:
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
不是万无一无,但似乎最简单的方法是初始化一个比您需要的大得多的列表,即
l = [None for i in some_large_number]
l[3] = 'foo'
# [None, None, None, 'foo', None, None None ... ]
如果您真的想要问题中的语法,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'}}
它不是一个"列表的列表",但它的工作或多或少像一个。
你真的需要指定用例…上面的方法有一些优点(您可以访问索引,而不需要先检查它们是否存在),也有一些缺点—例如,正常字典中的l[2]
将返回KeyError
,但在defaultdict
中,它只是创建一个空白的defaultdict
,添加它,然后返回它。
支持不同语法糖的其他可能实现可能涉及自定义类等,并将有其他权衡。
不能创建有空格的列表。你可以用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']