有没有一种方法可以从python中另一个数字上方的列表中的每个数字中减去一个数字?

时间:2020-03-05 20:09:07

标签: python list loops list-comprehension

我是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,并使该列表从1计数为8?

4 个答案:

答案 0 :(得分:3)

您可以尝试一下。

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]

答案 1 :(得分:2)

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

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

答案 2 :(得分:2)

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

答案 3 :(得分:2)

您的第一次尝试:

>>> 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]]