Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/306.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 为什么这个迭代的列表增长代码使indexer:list赋值索引超出范围? 请考虑以下代码: i = [1, 2, 3, 5, 8, 13] j = [] k = 0 for l in i: j[k] = l k += 1 print j_Python_List_Exception - Fatal编程技术网

Python 为什么这个迭代的列表增长代码使indexer:list赋值索引超出范围? 请考虑以下代码: i = [1, 2, 3, 5, 8, 13] j = [] k = 0 for l in i: j[k] = l k += 1 print j

Python 为什么这个迭代的列表增长代码使indexer:list赋值索引超出范围? 请考虑以下代码: i = [1, 2, 3, 5, 8, 13] j = [] k = 0 for l in i: j[k] = l k += 1 print j,python,list,exception,Python,List,Exception,输出(32位Win 7上的Python 2.6.6)为: 我想这很简单,我不明白。有人能把它弄清楚吗?做j.append(l)而不是j[k]=l,并避免k。j是一个空列表,但您试图在第一次迭代中写入元素[0],但它还不存在 请尝试以下操作,将新元素添加到列表末尾: for l in i: j.append(l) 当然,如果你只想复制一个现有的列表,那么在实践中你永远不会这么做。你只要做: j = list(i) 或者,如果希望像其他语言中的数组一样使用Python列表,则可以预先创建

输出(32位Win 7上的Python 2.6.6)为:


我想这很简单,我不明白。有人能把它弄清楚吗?

j.append(l)
而不是
j[k]=l
,并避免
k

j
是一个空列表,但您试图在第一次迭代中写入元素
[0]
,但它还不存在

请尝试以下操作,将新元素添加到列表末尾:

for l in i:
    j.append(l)
当然,如果你只想复制一个现有的列表,那么在实践中你永远不会这么做。你只要做:

j = list(i)
或者,如果希望像其他语言中的数组一样使用Python列表,则可以预先创建一个列表,将其元素设置为空值(
None
,在下面的示例中),然后覆盖特定位置的值:

i = [1, 2, 3, 5, 8, 13]
j = [None] * len(i)
#j == [None, None, None, None, None, None]
k = 0

for l in i:
   j[k] = l
   k += 1
需要意识到的是,
列表
对象不允许您为不存在的索引赋值

j.append(l)

另外,避免使用小写字母“L”,因为它们很容易与1混淆

您的另一个选择是初始化
j

j = [None] * len(i)

您还可以使用列表:

j = [l for l in i]
或者使用以下语句制作一份副本:

j = i[:]
还有一种方法:

j=i[0]
for k in range(1,len(i)):
    j = numpy.vstack([j,i[k]])

在本例中,
j
将是一个numpy数组

我认为Python方法insert就是您要寻找的:

在位置i插入元素x。 列表.插入(i,x)


您可以为j使用字典(类似于关联数组)

将打印:

{0: 1, 1: 2, 2: 3, 3: 5, 4: 8, 5: 13}
也许你需要扩展()



一种更短(更具Pythonic?)的方法可能是
j+=[l]
@BlaXpirit:我认为这会给垃圾收集器带来负担。@BalXpirit:考虑到这只会保存几个字符(特别是因为你需要为它添加空格才能被接受),而
.append
更为常见(也许是因为一个原因——我认为这更容易理解),在任何方面都不是真正的优秀。(编辑@khachik:No,
+=
修改到位)好的,非常感谢。我不知道该表扬哪一个,因为有三个几乎相同的答案。我认为这是最具描述性的。Cheers我可以看到,对于来自其他语言(如PHP或C)的人来说,这可能会让人非常困惑。j是一种列表类型,而不是数组。对于列表类型,我认为这是不可订阅的。如果出现这种情况,会让人非常困惑来自其他语言。@n列表类型是可下标的,但您只能访问已经存在的元素-无法通过尝试写入超出范围的索引来创建元素。j[0]=“foo”如果列表中已经至少有一个元素,它就会起作用。我想知道这个设计决策背后的原因…
append
是适合您的用例的正确解决方案,但是python列表中有一个insert方法,可以直接插入到列表中的第I个位置。
j.insert(k,l)
我可以问一下,为什么OP的解决方案不起作用?为什么要使用append?第二种构造是整洁的如果唯一的目标是复制列表,你可以简单地说j=list(I)我认为问题更多的是关于列表的行为,而不是特别需要一种复制元素的方法。你想使用len(I)而不是最大值。如果专门为此目的提供了
append
,则没有必要使用
insert
。就信息而言,您的代码实际上打印
[1,20,2,3,4,5]
。您是在索引1处插入的,取代了索引1及以后的索引。插入的值不会在索引2处结束。Iist.insert()只有当您不想将项目添加到列表末尾时才真正需要它;这里的问题正是如此,所以list.append()更可取。实际上,为什么我这样回答这个问题,我也感到惊讶:D不知道我在想什么:)这正是“list.append()”这是公认的答案。我认为它有助于人们解决问题或给出解决问题的想法,因此它获得了5次点击。对于从0开始的连续标记,映射通常是错误的数据结构,尤其是当映射没有切片或反转,因为它们不打算传达任何特定的顺序时。在单空格字体中,
l
1
大不相同,但对我来说却不是。
array = [1,2,3,4,5]

array.insert(1,20)

print(array)

# prints [1,2,20,3,4,5]
i = [1, 2, 3, 5, 8, 13]
j = {} #initiate as dictionary
k = 0

for l in i:
    j[k] = l
    k += 1

print(j)
{0: 1, 1: 2, 2: 3, 3: 5, 4: 8, 5: 13}
i=[1,3,5,7]
j=[]
j.extend(i)