【问题标题】:Replace each element in a list [duplicate]替换列表中的每个元素[重复]
【发布时间】:2018-11-29 19:53:07
【问题描述】:

如何将列表的每个元素替换为等于其自身乘积的新数字和我使用函数提供的数字。我通过定义新列表D 来实现预期目标。

D=[]
S= [1,2,3,4]

def num(x):
    for i in S:
        D.append(i*x)
    return D

num(2)

在上面的例子中,D 的输出是[2, 4, 6, 8]S 保持不变。我宁愿把S改成[2, 4, 6, 8]

【问题讨论】:

  • 为什么要替换原list中的元素?从长远来看,从外部范围改变对象也可能导致不良行为

标签: python python-3.x function


【解决方案1】:

您可能也应该将列表带入函数中。然后改变它的元素并(可选地)返回它:

def num(data,multi):
    """Multiplies each element of data (a list of ints) by multi.
    The original list is modified and returned as well for chaining."""
    # data[:] = [d*multi for d in data]  # inplace reassignment list comp
    # or
    for i,d in enumerate(data[:]): # this iterates a _copy_ of data, do not modify a list
        data[i]=d*multi            # that you currently iterate over - it is possible here
                                   # but often it is a bad idea if you add/remove things
    return data

S= [1,2,3,4]
num(S,2)

print(S)

输出:

[2,4,6,8]

在 SO 上有几个骗子:

其中一些用于 python2,其中 map 仍返回 list - 您可以查找它们以获得更多选项。

在函数内部也返回列表,将允许您链接调用:

num(num(num(S,2),3),4) # S = [24, 48, 72, 96]

【讨论】:

    【解决方案2】:

    您有很多选择。要么直接操作 S,要么重新分配它:

    def num(x):
        global S
        for index, value in enumerate(S):
            S[index] = value * x
    
    def num(x)
        inner = []
        for i in S:
            inner.append(i*x)
        return inner
    S = num(2)
    

    还有一个更理智的版本:

    S = [i*2 for i in S]
    

    现在是重要的部分,为什么这是理智的?好吧,因为 python 中的列表不是不可变的,所以你必须小心如何更改它们。在您的情况下,创建一个依赖于函数外部变量值的函数是有风险的。如果您总是想要第一个列表并且您在函数内更改(变异)它,您最终会遇到问题。如果您真的想改变您的原始列表,那很好,但您仍然可以通过列表理解(列出的最后一个选项)实现相同的目标。

    【讨论】:

      【解决方案3】:

      您可以覆盖现有值,而不是将值附加到新列表,如下所示:

      S = [1,2,3,4]
      
      def num(x):
          for i in range(0, len(S)):
              s[i] *= x
      

      【讨论】:

      • 你的内心陈述可以简化为s[i] *= x
      • @TemporalWolf 是的。谢谢你。
      猜你喜欢
      • 1970-01-01
      • 2021-03-03
      • 2021-05-19
      • 2020-01-10
      • 2015-02-12
      • 2017-02-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-16
      相关资源
      最近更新 更多