我想创建一个可以容纳10个元素的空列表(或者是最好的方法).
之后我想在该列表中分配值,例如,这应该显示0到9:
s1 = list();
for i in range(0,9):
s1[i] = i
print s1
Run Code Online (Sandbox Code Playgroud)
但是,当我运行此代码时,它会生成错误,或者在另一种情况下,它只显示[](空).
有人可以解释原因吗?
var*_*unl 714
lst[i] = something除非已使用至少i+1元素初始化列表,否则无法将列表分配给列表.您需要使用append将元素添加到列表的末尾.lst.append(something).
(如果使用字典,可以使用赋值表示法).
创建一个空列表:
>>> l = [None] * 10
>>> l
[None, None, None, None, None, None, None, None, None, None]
Run Code Online (Sandbox Code Playgroud)
将值分配给上面列表的现有元素:
>>> l[1] = 5
>>> l
[None, 5, None, None, None, None, None, None, None, None]
Run Code Online (Sandbox Code Playgroud)
请记住,类似的东西l[15] = 5仍会失败,因为我们的列表只有10个元素.
range(x)从[0,1,2,... x-1]创建一个列表
# 2.X only. Use list(range(10)) in 3.X.
>>> l = range(10)
>>> l
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Run Code Online (Sandbox Code Playgroud)
使用函数创建列表:
>>> def display():
... s1 = []
... for i in range(9): # This is just to tell you how to create a list.
... s1.append(i)
... return s1
...
>>> print display()
[0, 1, 2, 3, 4, 5, 6, 7, 8]
Run Code Online (Sandbox Code Playgroud)
列表理解(使用正方形,因为对于范围你不需要做所有这些,你可以返回range(0,9)):
>>> def display():
... return [x**2 for x in range(9)]
...
>>> print display()
[0, 1, 4, 9, 16, 25, 36, 49, 64]
Run Code Online (Sandbox Code Playgroud)
Ósc*_*pez 114
试试这个:
lst = [None] * 10
Run Code Online (Sandbox Code Playgroud)
上面将创建一个大小为10的列表,其中每个位置都被初始化为None.之后,您可以向其添加元素:
lst = [None] * 10
for i in range(10):
lst[i] = i
Run Code Online (Sandbox Code Playgroud)
不可否认,这不是Pythonic做事的方式.这样做更好:
lst = []
for i in range(10):
lst.append(i)
Run Code Online (Sandbox Code Playgroud)
或者甚至更好,使用这样的列表推导:
[i for i in range(10)]
Run Code Online (Sandbox Code Playgroud)
Jam*_* L. 69
varunl目前接受的答案
>>> l = [None] * 10
>>> l
[None, None, None, None, None, None, None, None, None, None]
Run Code Online (Sandbox Code Playgroud)
适用于非引用类型,如数字.不幸的是,如果你想创建一个列表列表,你将遇到引用错误.Python 2.7.6中的示例:
>>> a = [[]]*10
>>> a
[[], [], [], [], [], [], [], [], [], []]
>>> a[0].append(0)
>>> a
[[0], [0], [0], [0], [0], [0], [0], [0], [0], [0]]
>>>
Run Code Online (Sandbox Code Playgroud)
如您所见,每个元素都指向同一个列表对象.要解决此问题,您可以创建一个方法,将每个位置初始化为不同的对象引用.
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], [], [], [], [], [], [], [], [], []]
>>>
Run Code Online (Sandbox Code Playgroud)
有一种默认的内置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]]
Run Code Online (Sandbox Code Playgroud)
mgo*_*ser 14
有两种"快速"方法:
x = length_of_your_list
a = [None]*x
# or
a = [None for _ in xrange(x)]
Run Code Online (Sandbox Code Playgroud)
它似乎[None]*x更快:
>>> from timeit import timeit
>>> timeit("[None]*100",number=10000)
0.023542165756225586
>>> timeit("[None for _ in xrange(100)]",number=10000)
0.07616496086120605
Run Code Online (Sandbox Code Playgroud)
但是如果你对范围(例如[0,1,2,3,...,x-1])没问题,那么range(x)可能是最快的:
>>> timeit("range(100)",number=10000)
0.012513160705566406
Run Code Online (Sandbox Code Playgroud)
use*_*706 14
接受的答案有一些问题。例如:
>>> a = [{}] * 3
>>> a
[{}, {}, {}]
>>> a[0]['hello'] = 5
>>> a
[{'hello': 5}, {'hello': 5}, {'hello': 5}]
>>>
Run Code Online (Sandbox Code Playgroud)
所以每个字典都指向同一个对象。如果您使用数组或对象进行初始化,情况也是如此。
你可以这样做:
>>> b = [{} for i in range(0, 3)]
>>> b
[{}, {}, {}]
>>> b[0]['hello'] = 6
>>> b
[{'hello': 6}, {}, {}]
>>>
Run Code Online (Sandbox Code Playgroud)
我很惊讶没有人建议这种简单的方法来创建空列表列表.这是一个旧线程,但只是为了完整性添加它.这将创建一个包含10个空列表的列表
x = [[] for i in range(10)]
Run Code Online (Sandbox Code Playgroud)
我有点惊讶的是,创建初始化列表的最简单方法并不在这些答案中。只需在函数中使用生成器list:
list(range(9))
Run Code Online (Sandbox Code Playgroud)
(这是根据问题的原始版本编写的.)
我想创建一个空列表(或任何最好的方法)可以容纳10个元素.
所有列表都可以包含任意数量的元素,但仅限于可用内存的限制.重要的列表的唯一"大小"是当前其中的元素数量.
但是当我运行它时,结果是[]
print display s1是无效的语法; 根据你的,你看到的描述,我假设你的意思display(s1),然后print s1.要运行它,您必须先前已定义一个全局s1来传递给该函数.
调用display不会像写入的那样修改您传入的列表.你的代码说" s1是传递给函数的任何东西的名字;好吧,现在我们要做的第一件事就是完全忘掉那件事,让我们s1开始引用新创建的东西list.现在我们将修改它list".这对您传入的值没有影响.
没有理由在这里传递一个值.(也没有真正的理由创建一个函数,但这不是重点.)你想"创建"某些东西,这就是你的函数的输出.创建您描述的内容无需任何信息,因此请勿传递任何信息.要获取信息,return请将其删除.
这会给你一些类似的东西:
def display():
s1 = list();
for i in range(0, 9):
s1[i] = i
return s1
Run Code Online (Sandbox Code Playgroud)
您将注意到的下一个问题是您的列表实际上只有9个元素,因为该range函数会跳过结束点.(正如附注中所说的[]那样list(),分号是不必要的,分号是s1变量的一个很差的名称,range如果你从一开始就只需要一个参数0.)那么你最终会得到
def create_list():
result = list()
for i in range(10):
result[i] = i
return result
Run Code Online (Sandbox Code Playgroud)
然而,这仍然是标志; range是不是这就是语言的一部分的方式一些神奇的关键字for和def是,而是它的一个功能.并猜猜该函数返回什么?那是对的 - 这些整数的列表.所以整个功能都崩溃了
def create_list():
return range(10)
Run Code Online (Sandbox Code Playgroud)
现在你明白为什么我们根本不需要自己写一个函数了; range已经是我们正在寻找的功能.虽然,再次,没有必要或理由"预先确定"列表的大小.
n使用嵌套列表推导式创建二维大小矩阵的一种简单方法:
m = [[None for _ in range(n)] for _ in range(n)]
Run Code Online (Sandbox Code Playgroud)
另一种选择是使用 numpy 来处理固定大小的数组(指针):
> pip install numpy
import numpy as np
a = np.empty(10, dtype=np.object)
a[1] = 2
a[5] = "john"
a[3] = []
Run Code Online (Sandbox Code Playgroud)
如果你只想要数字,你可以使用 numpy:
a = np.arange(10)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1154169 次 |
| 最近记录: |