我是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?
答案 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]]