将嵌套列表中的每个元素乘以一个常数

时间:2019-06-19 02:40:25

标签: python list

我一直在阅读许多类似的帖子hereherehere,依此类推,但我无法解决自己的问题。我有一个像这样的配对列表:

 my_list = [[[0, 3], [0, 0]], [[77, 94], [76, 94], [77, 93], [76, 93], [76, 90], [77, 84], [76, 88]], [[25, 31], [10, 0]]]

我想将每个整数乘以-1。我尝试了不同的方法并得到了不同的错误,但这是我认为最符合逻辑的代码:

for p in range(len(my_list):
    for q in range(len(mylist[p])):
        my_new_list = [[i,j] * -1 for [i,j] in my_list[p][q]]

这个甚至没有用!我最终想要的是这样的东西:

my_new_list = [[[0, -3], [0, 0]], [[-77, -94], [-76, -94], [-77, -93], [-76, -93], [-76, -90], [-77, -84], [-76, -88]], [[-25, -31], [-10, 0]]]

有人可以帮我吗?

2 个答案:

答案 0 :(得分:5)

您的问题是您最内层的循环正在创建一个新的子列表,但没有适当地将其分配回(分配给新列表或my_list)。每次都被重写。

您需要的是具有三个循环的列表理解,每个循环用于一个嵌套级别:

my_new_list = [[[z * -1 for z in y] for y in x] for x in my_list]

如果您可以保证最里面的列表始终是成对的,则可以按照@ShadowRanger的建议进行简化,并使用带有两个循环的嵌套列表comp

my_new_list = [[[-a, -b] for a, b in x] for x in my_list]

这等效于

import copy 

my_new_list = copy.deepcopy(my_list)
for x in my_new_list:
    for y in x:
        for i, z in enumerate(y): 
            y[i] = z * -1   # notice the assignment back to the sublist

答案 1 :(得分:2)

要对任意深度列表进行操作,可以使用此递归函数:

def negate(list_or_int):
    if isinstance(list_or_int, list):
        # It's a list, so call negate on every element
        return [negate(i) for i in list_or_int]

    # It's an int, so just return the negative
    return -list_or_int

my_new_list = negate(my_list)