替换列表中的第n个元素

时间:2019-09-07 20:17:02

标签: python list replace

我有一个数字列表清单

a = [[1,2,3,4,5,6],
     [7,8,9,10,11,12],
     [13,14,15,16,17,18]]

我想将第n个元素替换为0,以得到类似的结果(在这种情况下,n = 3)

a = [[0,2,3,0,5,6],
     [0,8,9,0,11,12],
     [0,14,15,0,17,18]]

我希望像这样

a = [[i, j if j %n == 0 else i] for i, j in a]

但是我不知道它需要什么参数。

6 个答案:

答案 0 :(得分:3)

您可以在内部列表推导内使用ternary if-else,并使用enumerate来访问索引,每个元素作为元组:

n = 3
result = [[x if i % n else 0 for i, x in enumerate(y)] for y in a]

应用于您的示例列表,

>>> a = [[1,2,3,4,5,6],[7,8,9,10,11,12],[13,14,15,16,17,18]]
>>> n = 3
>>> [[x if i % n else 0 for i, x in enumerate(y)] for y in a]
[[0, 2, 3, 0, 5, 6], [0, 8, 9, 0, 11, 12], [0, 14, 15, 0, 17, 18]]

答案 1 :(得分:0)

尝试此代码。

a = [[1,2,3,4,5,6],
 [7,8,9,10,11,12],
 [13,14,15,16,17,18]]

n=3
for out in range(0,len(a)):
    for i in range(0,len(a[out])):
        if i == n:
            a[out][i] = 0

print(a)

答案 2 :(得分:0)

切片列表并创建一个新的0呢?

n=3; a = [l[:n] + [0] + l[n+1:] for l in a]

答案 3 :(得分:0)

ggorlen有正确的方法,但只是为了您的理解和其他想要学习列表理解的人详述。

首先,您需要遍历列表中的每个项目-

[item for item in l]

[[1, 2, 3, 4, 5, 6], [7, 8, 9, 10, 11, 12], [13, 14, 15, 16, 17, 18]]

接下来,您将对索引应用一个条件(位置必须为3),但是还需要修改元素本身。因此,您需要一起遍历索引和元素。

[[(i,n) for i,n in enumerate(item)] for item in l]

[[(0, 1), (1, 2), (2, 3), (3, 4), (4, 5), (5, 6)],
 [(0, 7), (1, 8), (2, 9), (3, 10), (4, 11), (5, 12)],
 [(0, 13), (1, 14), (2, 15), (3, 16), (4, 17), (5, 18)]]

每个元组是(索引,元素)。 最后,您需要您的条件。列表理解中有多种使用if条件的方法,但是对于您而言,您需要检查(index,element)元组中的索引,并查看除以3后它是否返回余数。如果是,则返回该元素否则返回0。

[[n if i%3 else 0 for i,n in enumerate(item)] for item in l]

[[0, 2, 3, 0, 5, 6], [0, 8, 9, 0, 11, 12], [0, 14, 15, 0, 17, 18]]

希望这种解释可以帮助您解决类似这样的未来问题。

干杯。

答案 4 :(得分:0)

解决方案

a = [[0 if index==0 else j for index, j in enumerate(i)] for i in a]

>>> a = [[1,2,3,4,5,6], [7,8,9,10,11,12], [13,14,15,16,17,18]]
>>> a = [[0 if index==0 else j for index, j in enumerate(i)] for i in a]
>>> a
[[0, 2, 3, 4, 5, 6], [0, 8, 9, 10, 11, 12], [0, 14, 15, 16, 17, 18]]

在Python 3.8中,您将引入赋值表达式。

这是一个新的符号:= ,它允许(除其他事项外)进行理解。

答案 5 :(得分:0)

尽管将花费多行代码,但是您可以通过如下所示的方式来创建通用解决方案,这将修改 inplace 列表列表,因此比重新创建整个内容只是为了更改一些值。

def replace_nth(list_of_lists, n, value):
    for sublist in list_of_lists:
        for i, v in enumerate(sublist):
            if not i % n:
                sublist[i] = value

a = [[1,2,3,4,5,6],
     [7,8,9,10,11,12],
     [13,14,15,16,17,18]]

replace_nth(a, 3, 0)
print(a)  # -> [[0, 2, 3, 0, 5, 6], [0, 8, 9, 0, 11, 12], [0, 14, 15, 0, 17, 18]]