如何在Python中处理以下情况?

时间:2011-04-20 20:55:17

标签: python c

我想说

a[current] = value 

而不是说

a.append(value)

因为我想表明当前值是值。前一个清单显示了这个更好。我来自C,所以我对python列表有点困惑。在C中我预先分配空间,因此在分配值之前,[current]将存在并包含垃圾。我可以在Python中做类似的事情吗?

9 个答案:

答案 0 :(得分:5)

您可以执行类似

的操作
[0] * 10

将导致

[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

但你的方法可能不会非常“pythonic”。如果切换到Python,你还应该考虑在python中思考。 ; - )

答案 1 :(得分:1)

您可以使用

分配长度为n的列表
my_list = [None] * n

显然,列表将被初始化而不是包含垃圾。

尽管如此,请注意,列表理解通常可以替代包含list.append()调用的循环。

答案 2 :(得分:1)

当我第一次使用Python时,我一直遇到这个问题。您可以执行“[0] * 10”之类的操作,但不够优雅,如果您尝试对列表列表执行相同操作,则会导致问题。

我终于通过实现大部分时间来解决这个问题,我只需要将问题重新制定成更加pythonic的东西。列表理解(如上所述)几乎总是正确的答案。如果要预先分配空间,这意味着您可能会迭代其他列表,执行某些操作,然后将新列表中的元素设置为该值:

 newList = [op(e) for e in oldList]

你可以变得更加漂亮。例如,如果您不想要所有元素,则可以设置过滤器:

 newList = [op(e) for e in oldList if e < 5]

只会将小于5的项目放入newList。

然而,有时列表理解并不是你想要的。例如,如果你正在进行数学编码,那么numpy就可以解决问题:

  myVector = numpy.zeros(10)

将创建一个包含10个元素的数组。

答案 3 :(得分:0)

如果要在Python中创建一个初始化为零的n元素列表(读取“preallocate”),请使用:

somelist = [0] * n

这是你想要的吗?

答案 4 :(得分:0)

如果您不喜欢append,可以执行

之类的操作
a = [None]*10
for i in range(10):
    a[i] = something()

答案 5 :(得分:0)

您可能也对python arrays感兴趣。

答案 6 :(得分:0)

我认为最近似的语法是:

a.insert(current, value)

但是如果current不是数组中的最后一个位置,insert将分配一些额外的空间并在当前位置之后移动所有内容。不知道这是否是理想的行为。以下代码就像一个追加:

a.insert(len(a), value)

答案 7 :(得分:0)

如果您要维护一个单独的current变量来指示下一个项目的插入位置(也就是说,您的行a[current] = value会紧跟current += 1并且您希望你可以写a[current++] = value),然后你用Python写C,应该停止。 : - )

否则,您可能希望使用您希望其包含的项目数预先分配列表,正如其他人所示。如果您想要一个自动扩展以填充缺失值的列表,即使列表只有50个项目,a[100] = value也可以工作,这可以使用自定义{{1列表子类上的方法:

__setitem__()

答案 8 :(得分:0)

如果您想显示当前值是'value',为什么不为它使用变量呢?

a.append(value)
current_value = value