【问题标题】:Is there a way to subtract a number from every number in a list above another number in python?有没有办法从python中另一个数字上方的列表中的每个数字中减去一个数字?
【发布时间】:2020-06-18 13:09:13
【问题描述】:

我对 python 很陌生,所以希望这将是一个简单的问题。我有一个包含一堆数字的列表,如果该数字高于某个其他数字,我想从其中减去一个。例如,我有以下列表缺少 4 个:

a = [1, 2, 3, 5, 6, 7, 8, 9]

如何将大于 4 的每个数字减一?我尝试了一个 for 循环:

for x in a:
    if x > 4:
        x-=1
print(a)

但这不会改变列表中的任何内容。 我也尝试过列表推导,但我对它们很陌生,所以我无法让它工作并出现错误:

a = [[x - 1 if x > 4] for x in a]
a = [[x - 1 for x in a] if x > 4]

我该怎么做才能将超过 4 的每个数字减一并使该列表从 1 计数到 8?

【问题讨论】:

  • 你可以试试a = [x - 1 if (x > 4) else x for x in a]
  • @DOOM 很遗憾,这给了我一个 SytaxError
  • [x - 1 if (x > 4) else x for x in a] = [1, 2, 3, 4, 5, 6, 7, 8] ??
  • @DOOM 在我的机器上运行良好
  • for 循环不起作用,因为x 没有保留任何与列表中原始值的链接;那时它只是一个独立变量,分配给x 不会影响其他任何东西。

标签: python list loops list-comprehension


【解决方案1】:

你可以试试这个。

a = [1, 2, 3, 5, 6, 7, 8, 9]
[i-1 if i>4 else i for i in a]
# [1, 2, 3, 4, 5, 6, 7, 8]

【讨论】:

  • 谢谢!这非常有效,我会尽快接受答案!
  • 很高兴为您提供帮助 ;)
【解决方案2】:

您可以使用enumerate 为列表中的项目生成索引以进行迭代,以便您可以通过其索引更改项目的值:

for i, x in enumerate(a):
    if x > 4:
        a[i] -= 1

【讨论】:

    【解决方案3】:
    [x - 1 if x>4 else x for x in a]
    

    【讨论】:

      【解决方案4】:

      你的第一次尝试:

      >>> a = [1, 2, 3, 5, 6, 7, 8, 9]
      >>> for x in a:
      ...     if x > 4:
      ...         x -= 1
      

      失败(如你所说):

      >>> a
      [1, 2, 3, 5, 6, 7, 8, 9]
      

      那是因为你正在处理整数,而整数在 Python 中是不可变的对象(浮点数、字符串……是不可变的)。当你写x -= 1时,x没有被修改,而是创建了一个新的x,销毁了旧的:

      >>> x = 1
      >>> id_bkp = id(x) # store the "id" of x
      >>> x -= 1
      >>> id(x) == id_bkp # this another x!!
      False
      

      您不能更改列表的元素(它们是不可变的)。因此,您必须创建一个新列表:

      >>> a = [1, 2, 3, 5, 6, 7, 8, 9]
      >>> b = []
      >>> for x in a:
      ...     if x > 4:
      ...         b.append(x - 1)
      ...     else:
      ...         b.append(x)
      >>> b
      [1, 2, 3, 4, 5, 6, 7, 8]
      

      它有效,但您可以使用更短的语法。列表推导是一种从现有列表创建新列表的方法。但是您必须将 if/else 从语句转换为表达式:

      >>> b = []
      >>> for x in a:
      ...     b.append(x - 1 if x > 4 else x)
      >>> b
      [1, 2, 3, 4, 5, 6, 7, 8]
      

      现在,列表推导:

      >>> b = [x - 1 if x > 4 else x for x in a]
      >>> b
      [1, 2, 3, 4, 5, 6, 7, 8]
      

      请注意,如果您有一个列表列表,您会得到不同的结果,因为列表是可变的:

      >>> b = [[1], [2], [3], [5], [6], [7], [8], [9]]
      >>> for y in b: # y is a singleton list
      ...     if y[0] > 4:
      ...          y[0] -= 1
      
      >>> b
      [[1], [2], [3], [4], [5], [6], [7], [8]]
      

      【讨论】:

        猜你喜欢
        • 2011-06-22
        • 2012-08-19
        • 1970-01-01
        • 2019-05-13
        • 1970-01-01
        • 1970-01-01
        • 2021-12-01
        • 1970-01-01
        • 2019-07-27
        相关资源
        最近更新 更多