在 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:
您不能对像 这样的列表进行赋值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:
列表始终是“可迭代的”,并且您可以随时向其中添加新元素:
插入:
list.insert(indexPosition, value)
附加:
list.append(value)
延长:
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)
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 项目管理必备:盘点2024年13款好用的项目管理软件
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)