【问题标题】:Append the same value multiple times to a list [duplicate]将相同的值多次附加到列表中[重复]
【发布时间】:2013-12-23 22:43:24
【问题描述】:

为了使我的程序更漂亮而不是丑陋,我试图找到一种更 Python 的方式来多次将单个值添加到列表中。我现在使用循环,但我创建了一个不使用的变量。

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

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

有什么想法吗?

【问题讨论】:

  • 这将定义 l,而不是附加到它。如果 l 已经持有值,它们就会丢失。
  • 谢谢大家,Lattyware 给出了最一般的答案,虽然我会在这个特定的情况下使用 Boo 的解决方案 ;)

标签: python list append


【解决方案1】:

将 v,n 次加到 l:

l += n * [v]

【讨论】:

    【解决方案2】:

    尝试使用list.extend 和列表的乘法运算符

    l.extend([v] * n)
    

    【讨论】:

    • 请注意,这将生成[v, v, v...]n 次的列表,如果该值是不可变的,这很好,但如果该值是可变的并且您希望它们是独立的,则可能会导致意外行为.
    • 请注意,如果v 是一个可变对象,那么它可能会导致不希望的结果。
    • 如果你知道v是可变的你应该改用[v.copy()] * n
    • @NilsWerner 那行不通。它将复制该值一次,然后列出对该副本的n 引用。
    • 哦,你是对的。没想到……
    【解决方案3】:

    对此最一般的答案是使用list.extend()generator expression

    l.extend(generate_value() for _ in range(n))
    

    这将添加一个值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 个对同一列表的引用的列表。当你改变它时,你会看到列表中每个元素的变化——因为它们都是一样的。

    使用生成器表达式或列表推导式时,会为每个子项创建一个新列表,因此每个项都是不同的值。修改一个只会影响那个。

    显然,在您的示例中,这些值是不可变的,所以这无关紧要 - 但对于不同的情况,或者如果值 可能不是是不可变的,则值得记住。

    【讨论】:

    • 作为generate_value()的替代品;大多数情况下你也可以使用copy.deepcopy()
    • @LieRyan '在大多数情况下'很强大 - 在大多数情况下,您可能只是在其中放置构造函数调用或文字,因此不需要复制。 copy.deepcopy() 也只适用于实现 __deepcopy__() 的东西,这不是保证。 generate_value() 是一个占位符,旨在表明可以使用任何产生值的东西 - 包括但不限于 copy.deepcopy()
    【解决方案4】:

    试试这个

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-02-25
      • 2016-06-24
      • 2021-11-14
      • 2013-06-18
      • 2021-02-23
      • 1970-01-01
      • 2015-08-05
      • 2021-04-23
      相关资源
      最近更新 更多