Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/google-chrome/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中,在列表中的任意索引处设置元素?_Python - Fatal编程技术网

在Python中,在列表中的任意索引处设置元素?

在Python中,在列表中的任意索引处设置元素?,python,Python,我知道,对于Python中的列表,通常不能在任意索引处设置列表中元素的值;在本例中,即使我尝试在新创建的列表的索引5处插入,我也只会在下一个可用索引处追加值: $python3 win32上的Python 3.8.5(默认值,2020年7月21日,11:59:41)[GCC 10.1.0 64位(AMD64)] 有关详细信息,请键入“帮助”、“版权”、“信用证”或“许可证”。 >>>aa=[] >>>aa[0]=1 回溯(最近一次呼叫最后一次): 文件“”,第1行,在 索引器:列表分配索引超出范

我知道,对于Python中的列表,通常不能在任意索引处设置列表中元素的值;在本例中,即使我尝试在新创建的列表的索引5处插入,我也只会在下一个可用索引处追加值:

$python3
win32上的Python 3.8.5(默认值,2020年7月21日,11:59:41)[GCC 10.1.0 64位(AMD64)]
有关详细信息,请键入“帮助”、“版权”、“信用证”或“许可证”。
>>>aa=[]
>>>aa[0]=1
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
索引器:列表分配索引超出范围
>>>aa.插入(5100)
>>>aa
[100]
>>>aa.插入(5100)
>>>aa
[100, 100]
但是,假设我有像“3:17”、“5:72”这样的对,其中第一个数字是索引,第二个数字是值——它们是从某个源(比如数据库)随机输入的,我想用它们填充一个列表

理想情况下,我会设想一个方法,让我们调用它是
伪集
,它将具有如下签名:

list.pseudoset(index, value, value-for-not-yet-existing-indices)
。。。因此,如果我们有:

mylist = []
mylist.pseudoset(3, 17, None)
。。。我会以
mylist
成为
[None,None,None,17]
;如果在此之后我发布:

mylist.pseudoset(5, 72, None)
。。。我会以
mylist
作为
[None,None,None,17,None,72]
;如果在此之后我尝试:

mylist.pseudoset(1, 32, None)
。。。我会以
mylist
作为
[None,32,None,17,None,72]
结束

但是,我不知道Python中有这样的
list
方法

以下是作为(失败)代码的示例,改为使用
insert

incoming_data=[“3:17”、“5:72”、“1:32”]
传入的_列表=[]
对于传入的\u数据中的对:
lpair=pair.split(“:”)
索引=int(lpair[0])
thevalue=int(lpair[1])
输入列表。插入(索引,值)
打印(输入列表)#打印:[17,32,72]
因此,这里的输出是
[17,32,72]
,但它应该是
[None,32,None,17,None,72]
(对于列表中未指定/尚未指定的元素,可以是
以外的任意值)。此外,最终输出应该是一个
列表
,而不是
OrderedDict
或其他类


我可以用Python来做这件事吗?如果可以,怎么做?

只需使用dict,然后转换为您需要的列表:

>>> incoming_data = [ "3:17", "5:72", "1:32" ]
>>> data = {}
>>> for item in incoming_data:
...     i, value = map(int, item.split(':'))
...     data[i] = value
...
>>> data
{3: 17, 5: 72, 1: 32}
>>> max_i = max(data)
>>> data = [data.get(i, 'default') for i in range(max_i + 1)]
>>> data
['default', 32, 'default', 17, 'default', 72]

首先添加虚拟项,直到列表的大小足以使索引
索引
有效,为什么不使用
dict()
“通常不能将列表中元素的值设置为任意索引;”可以。但索引必须存在,才能执行此操作
.insert
不是通常在列表中设置值的方式,它具有文档中描述的语义(超出范围会附加到末尾)。通常,您通过执行
mylist[index]=value
设置索引,我觉得您应该使用
dict
,然后在最后,根据该dict创建一个列表。谢谢@RiccardoBucco-这似乎确实回答了我的问题!谢谢@juanpa.arrivillaga-我知道
mylist[index]=value
,但是在这种情况下,如果
索引器:列表分配索引超出范围,则会立即失败,如OP中的第一个片段所示;我只是用
insert
来说明我需要什么(尽管产生了错误的结果)。谢谢-我不知道
数据。在列表中获取(I,'default')
,这就是为什么我发现将dict转换为list很困难的原因,也是我问这个问题的原因。@sdbbs好吧,那是在dicts@Kaushal这个解决方案不依赖于dict对象保持顺序,而且在任何情况下,python3.7+中的dict对象都保持顺序order@Kaushal-没错,dict不保留顺序,但是.get检索恰好是整数的键,范围内i的
保证顺序,我认为。@sdbbs在3.7+中是这样做的(在CPython 3.6中作为实现细节)