将同一个值多次附加到列表中

18
为了让我的程序看起来更美观而不是丑陋,我试图寻找一种更Pythonic的方法将单个值多次添加到列表中。我现在使用循环,但我创建了一个未使用的变量。
l = []; n = 5; v = 0.5

for i in xrange(n):
    l.append(v)

有什么想法吗?


这将定义l,而不是向其附加。如果l已经保存了值,则这些值将丢失。 - Boo
感谢大家,特别是Lattyware提供的最通用的答案,尽管在这个具体情况下我会使用Boo的解决方案 ;) - Bsje
4个回答

51

将 v 添加到 l 中,重复 n 次:

l += n * [v]

11

尝试使用 list.extend 方法和列表乘法运算符来操作列表

l.extend([v] * n)

4
请注意,这将生成一个[v,v,v ...]列表,重复n次,如果该值是不可变的,则可以接受,但如果该值是可变的并且您希望它们是独立的,则可能会导致意外行为。 - Gareth Latty
1
请注意,如果v是可变对象,则可能会导致不良结果。 - Ashwini Chaudhary
如果您知道 v 是可变的,那么应该使用 [v.copy()] * n - Nils Werner
1
@NilsWerner 那样不行。它会复制一次该值,然后生成对该副本的 n 个引用的列表。 - Gareth Latty
哦,你说得对。没想到会这样... - Nils Werner
@NilsWerner 这是因为该值被评估为文字,然后放入列表中。当您乘以该列表时,它只是一个包含对对象引用的列表 - 即使Python想要复制该项,它也不知道如何复制(__copy __()是一个好猜测,但不能保证已实现或可能)。问题在于期望 * 重新评估表达式,但它并没有这样做。它只是复制了一个引用。如果您将其视为 new = v.copy() [new] * n - 它完全相同。 - Gareth Latty

10
这个问题的最一般的答案是使用 list.extend() 和一个 生成器表达式
l.extend(generate_value() for _ in range(n))

这将会添加一个值 n 次。请注意,每次这将评估generate_value(),从而规避其他答案可能存在的可变值问题:

这将会添加一个值 n 次。请注意,每次这将评估 generate_value(),从而规避其他答案可能存在的可变值问题:

>>> [[1]] * 5
[[1], [1], [1], [1], [1]]
>>> _[0].append(1)
>>> _
[[1, 1], [1, 1], [1, 1], [1, 1], [1, 1]]
>>> [[1] for _ in range(5)]
[[1], [1], [1], [1], [1]]
>>> _[0].append(1)
>>> _
[[1, 1], [1], [1], [1], [1]]
使用乘法方法时,您最终会得到一个包含 n 个对同一列表的引用的列表。当您进行更改时,您会在列表的每个元素中看到更改-因为它们都相同。
使用生成器表达式或列表推导时,为每个子项创建一个新列表,因此每个项目都是不同的值。修改一个只会影响该项目。
显然,在您的示例中,这些值是不可变的,所以这并不重要-但是对于不同情况或如果值可能不可变,则值得记住。

1
作为 generate_value() 的替代方案,在大多数情况下,您也可以使用 copy.deepcopy() - Lie Ryan
“在大多数情况下”是强调语气 - 在大多数情况下,您可能只需放置一个构造函数调用或文字,因此不需要复制。 copy.deepcopy() 仅适用于实现了 __deepcopy __() 的对象,这并不是保证。 generate_value() 是一个占位符,旨在表明可以使用任何生成值的东西 - 包括但不限于 copy.deepcopy() - Gareth Latty

2

试试这个

n = 5
v = 0.5
l = [v]*n 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接