在 Python 中创建一个具有一定大小的空列表[重复]

2024-12-06 08:40:00
admin
原创
130
摘要:问题描述:如何创建一个可容纳 10 个元素的空列表?之后,我想在该列表中分配值。例如:xs = list() for i in range(0, 9): xs[i] = i 但是,结果却是IndexError: list assignment index out of range。为什么呢?解决方案 1...

问题描述:

如何创建一个可容纳 10 个元素的空列表?

之后,我想在该列表中分配值。例如:

xs = list()
for i in range(0, 9):
   xs[i] = i

但是,结果却是IndexError: list assignment index out of range。为什么呢?


解决方案 1:

您不能对像 这样的列表进行赋值xs[i] = value,除非该列表已至少初始化了i+1元素(因为第一个索引为 0)。相反,使用xs.append(value)将元素添加到列表末尾。(尽管如果您使用的是字典而不是列表,则可以使用赋值符号。)

创建一个空列表:

>>> xs = [None] * 10
>>> xs
[None, None, None, None, None, None, None, None, None, None]

为上述列表的现有元素分配一个值:

>>> xs[1] = 5
>>> xs
[None, 5, None, None, None, None, None, None, None, None]

请记住,类似的操作xs[15] = 5仍然会失败,因为我们的列表只有 10 个元素。

range(x) 从 [0, 1, 2, ... x-1] 创建一个列表

# 2.X only. Use list(range(10)) in 3.X.
>>> xs = range(10)
>>> xs
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

使用函数创建列表:

>>> def display():
...     xs = []
...     for i in range(9): # This is just to tell you how to create a list.
...         xs.append(i)
...     return xs
... 
>>> print display()
[0, 1, 2, 3, 4, 5, 6, 7, 8]

列表理解(使用正方形,因为对于范围你不需要做所有这些,你只需返回range(0,9)):

>>> def display():
...     return [x**2 for x in range(9)]
... 
>>> print display()
[0, 1, 4, 9, 16, 25, 36, 49, 64]

解决方案 2:

尝试一下这个:

lst = [None] * 10

上述代码将创建一个大小为 10 的列表,其中每个位置都初始化为None。之后,你可以向其中添加元素:

lst = [None] * 10
for i in range(10):
    lst[i] = i

不可否认,这不是 Python 的做事方式。最好这样做:

lst = []
for i in range(10):
    lst.append(i)

或者更简单,在 Python 2.x 中你可以这样做来初始化一个从 0 到 9 的值的列表:

lst = range(10)

在 Python 3.x 中:

lst = list(range(10))

解决方案 3:

varunl 当前接受的答案

 >>> l = [None] * 10
 >>> l
 [None, None, None, None, None, None, None, None, None, None]

适用于数字等非引用类型。不幸的是,如果您想创建列表的列表,您将遇到引用错误。Python 2.7.6 中的示例:

>>> a = [[]]*10
>>> a
[[], [], [], [], [], [], [], [], [], []]
>>> a[0].append(0)
>>> a
[[0], [0], [0], [0], [0], [0], [0], [0], [0], [0]]
>>> 

如您所见,每个元素都指向同一个列表对象。为了解决这个问题,您可以创建一个方法,将每个位置初始化为不同的对象引用。

def init_list_of_objects(size):
    list_of_objects = list()
    for i in range(0,size):
        list_of_objects.append( list() ) #different object reference each time
    return list_of_objects


>>> a = init_list_of_objects(10)
>>> a
[[], [], [], [], [], [], [], [], [], []]
>>> a[0].append(0)
>>> a
[[0], [], [], [], [], [], [], [], [], []]
>>> 

可能存在一种默认的、内置的 Python 方式来执行此操作(而不是编写函数),但我不确定它是什么。很高兴得到纠正!

编辑:是的[ [] for _ in range(10)]

例子 :

>>> [ [random.random() for _ in range(2) ] for _ in range(5)]
>>> [[0.7528051908943816, 0.4325669600055032], [0.510983236521753, 0.7789949902294716], [0.09475179523690558, 0.30216475640534635], [0.3996890132468158, 0.6374322093017013], [0.3374204010027543, 0.4514925173253973]]

解决方案 4:

我很惊讶没有人建议用这种简单的方法来创建一个空列表。这是一个老话题,但只是为了完整性而添加它。这将创建一个包含 10 个空列表的列表

x = [[] for i in range(10)]

解决方案 5:

有两种“快速”方法:

x = length_of_your_list
a = [None]*x
# or
a = [None for _ in xrange(x)]

看起来速度[None]*x更快:

>>> from timeit import timeit
>>> timeit("[None]*100",number=10000)
0.023542165756225586
>>> timeit("[None for _ in xrange(100)]",number=10000)
0.07616496086120605

但是如果你对范围没问题(例如[0,1,2,3,...,x-1]),那么range(x)可能是最快的:

>>> timeit("range(100)",number=10000)
0.012513160705566406

解决方案 6:

您可以.append(element)添加到列表中,例如:

s1.append(i)

您当前正在尝试访问s1[i]不存在的元素()。

解决方案 7:

接受的答案有一些陷阱。例如:

>>> a = [{}] * 3
>>> a
[{}, {}, {}]
>>> a[0]['hello'] = 5
>>> a
[{'hello': 5}, {'hello': 5}, {'hello': 5}]
>>> 

因此每个字典都引用同一个对象。如果你使用数组或对象进行初始化,情况也是如此。

你可以这样做:

>>> b = [{} for i in range(0, 3)]
>>> b
[{}, {}, {}]
>>> b[0]['hello'] = 6
>>> b
[{'hello': 6}, {}, {}]
>>> 

解决方案 8:

如何创建一个可容纳 10 个元素的空列表?

所有列表都可以容纳任意数量的元素,仅受可用内存的限制。列表唯一重要的“大小”是其中当前元素的数量。

但是,结果却是IndexError: list assignment index out of range。为什么呢?

第一次循环时,i等于0。因此,我们尝试xs[0] = 0。这不起作用,因为列表中当前有 0 个元素,因此0不是有效索引。

我们不能使用索引来写入尚不存在的列表元素 - 我们只能覆盖现有的元素。相反,我们应该使用以下.append方法:

xs = list();
for i in range(0, 9):
   xs.append(i)

您将注意到的下一个问题是您的列表实际上只有 9 个元素,因为函数跳过了终点range。(如附注:[]与 一样好用,分号是不必要的,如果您从 开始,list()只需要一个参数。)解决这些问题可以得到:range`0`

xs = []
for i in range(10):
    xs.append(i)

但是,这仍然没有达到目标——range它并不是语言中某些神奇的关键字for(或者说def)。

在 2.x 中,range是一个函数,它直接返回我们已经想要的列表:

xs = range(10) # 2.x specific!
# In 3.x, we don't get a list; we can do a lot of things with the
# result, but we can't e.g. append or replace elements.

在 3.x 中,range是一个设计巧妙的 ,并range(10)创建一个实例。要获取所需的列表,我们可以简单地将其提供给list构造函数:

xs = list(range(10)) # correct in 3.x, redundant in 2.x

解决方案 9:

n使用嵌套列表推导创建大小为 2D 矩阵的一种简单方法:

m = [[None for _ in range(n)] for _ in range(n)]

解决方案 10:

我有点惊讶,创建初始化列表的最简单方法不在这些答案中。只需在list函数中使用生成器:

list(range(9))

解决方案 11:

另一种选择是使用 numpy 来存储固定大小的数组(指针):

> pip install numpy

import numpy as np


a = np.empty(10, dtype=np.object)
a[1] = 2
a[5] = "john"
a[3] = []

如果你只想要数字,你可以用 numpy 来做:

a = np.arange(10)

解决方案 12:

这是我在 Python 中用于二维列表的代码,它将从输入中读取行数:

empty = []
row = int(input())

for i in range(row):
    temp = list(map(int, input().split()))
    empty.append(temp)

for i in empty:
    for j in i:
        print(j, end=' ')
    print('')

解决方案 13:

列表始终是“可迭代的”,并且您可以随时向其中添加新元素:

  1. 插入:list.insert(indexPosition, value)

  2. 附加:list.append(value)

  3. 延长:list.extend(value)

在您的例子中,您实例化了一个长度为 0 的空列表。因此,当您尝试使用列表索引 (i) 向列表添加任何值时,它指向的是一个不存在的位置。因此,您收到错误“IndexError:列表分配索引超出范围”。

你可以尝试这个:

s1 = list();
for i in range(0,9):
   s1.append(i)

print (s1)

要创建一个大小为 10 的列表(假设),您可以先创建一个空数组,如np.empty(10),然后使用将其转换为列表arrayName.tolist()。或者,您也可以将它们链接起来。

            **`np.empty(10).tolist()`**

解决方案 14:

我在搜索类似问题时遇到了这个 SO 问题。我必须构建一个 2D 数组,然后用字典中的元素替换每个列表(在 2D 数组中)的某些元素。然后我遇到了这个SO 问题,它对我有帮助,也许这会帮助其他初学者解决问题。关键技巧是将 2D 数组初始化为 numpy 数组,然后使用array[i,j]而不是array[i][j]

作为参考,这是我必须使用的一段代码:

nd_array = []
for i in range(30):
    nd_array.append(np.zeros(shape = (32,1)))
new_array = []
for i in range(len(lines)):
    new_array.append(nd_array)
new_array = np.asarray(new_array)
for i in range(len(lines)):
    splits = lines[i].split(' ')
    for j in range(len(splits)):
        #print(new_array[i][j])
        new_array[i,j] = final_embeddings[dictionary[str(splits[j])]-1].reshape(32,1)

现在我知道我们可以使用列表推导,但为了简单起见,我使用了嵌套的 for 循环。希望这能帮助到看到这篇文章的其他人。

解决方案 15:

从技术上来说,它不是列表,但在功能上与列表类似,并且长度固定

from collections import deque
my_deque_size_10 = deque(maxlen=10)

如果已满,即有 10 个项目,则添加另一个项目会导致项目 @index 0 被丢弃。先进先出...但您也可以向任一方向追加。例如

  • 统计数据的滚动平均值

  • 通过管道传输列表,也就是在列表上滑动窗口,直到与另一个双端队列对象匹配。

如果你需要一个列表,那么当列表满了的时候就使用列表(deque 对象)

解决方案 16:

s1 = []
for i in range(11):
   s1.append(i)

print s1

要创建列表,只需使用以下括号:“[]”

要向列表中添加内容,请使用 list.append()

解决方案 17:

使其作为一项功能更具可重复使用性。

def createEmptyList(length,fill=None):
    '''
    return a (empty) list of a given length
    Example:
        print createEmptyList(3,-1)
        >> [-1, -1, -1]
        print createEmptyList(4)
        >> [None, None, None, None]
    '''
    return [fill] * length

解决方案 18:

此代码生成一个包含 10 个随机数的数组。

import random
numrand=[]
for i in range(0,10):
   a = random.randint(1,50)
   numrand.append(a)
   print(a,i)
print(numrand)
相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1102  
  IPD(Integrated Product Development,集成产品开发)流程是一种广泛应用于高科技和制造业的产品开发方法论。它通过跨职能团队的紧密协作,将产品开发周期缩短,同时提高产品质量和市场成功率。在IPD流程中,CDCP(Concept Decision Checkpoint,概念决策检查点)是一个关...
IPD培训课程   64  
  研发IPD(集成产品开发)流程作为一种系统化的产品开发方法,已经在许多行业中得到广泛应用。它不仅能够提升产品开发的效率和质量,还能够通过优化流程和资源分配,显著提高客户满意度。客户满意度是企业长期成功的关键因素之一,而IPD流程通过其独特的结构和机制,能够确保产品从概念到市场交付的每个环节都围绕客户需求展开。本文将深入...
IPD流程   54  
  IPD(Integrated Product Development,集成产品开发)流程是一种以跨职能团队协作为核心的产品开发方法,旨在通过优化资源分配、提高沟通效率以及减少返工,从而缩短项目周期并提升产品质量。随着企业对产品上市速度的要求越来越高,IPD流程的应用价值愈发凸显。通过整合产品开发过程中的各个环节,IPD...
IPD项目管理咨询   65  
  跨部门沟通是企业运营中不可或缺的一环,尤其在复杂的产品开发过程中,不同部门之间的协作效率直接影响项目的成败。集成产品开发(IPD)作为一种系统化的项目管理方法,旨在通过优化流程和增强团队协作来提升产品开发的效率和质量。然而,跨部门沟通的复杂性往往成为IPD实施中的一大挑战。部门之间的目标差异、信息不对称以及沟通渠道不畅...
IPD是什么意思   59  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用