我一直在阅读许多类似的帖子here,here,here,依此类推,但我无法解决自己的问题。我有一个像这样的配对列表:
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]]]
有人可以帮我吗?
答案 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)