我在这里,这里,这里等等都读过很多类似的文章,但是我无法解决我的问题。我有一个像这样的配对列表:
my_list = [[[0, 3], [0, 0]], [[77, 94], [76, 94], [77, 93], [76, 93], [76, 90], [77, 84], [76, 88]], [[25, 31], [10, 0]]]
Run Code Online (Sandbox Code Playgroud)
我想将每个整数乘以-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]]
Run Code Online (Sandbox Code Playgroud)
而且这个甚至都不起作用!我最终想要的是这样的:
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]]]
Run Code Online (Sandbox Code Playgroud)
有人可以帮我吗?
您的问题是,您的最内层循环正在创建一个新的子列表,但没有my_list适当地将其分配回(分配给新列表或)。每次都重写前一次迭代的结果。
您需要的是具有三个循环的列表理解,每个循环用于一个嵌套级别:
my_new_list = [[[z * -1 for z in y] for y in x] for x in my_list]
Run Code Online (Sandbox Code Playgroud)
如果可以保证最里面的列表始终是成对的,则可以按照@ShadowRanger的建议进行简化,并使用带有两个循环的嵌套列表comp,
my_new_list = [[[-a, -b] for a, b in x] for x in my_list]
Run Code Online (Sandbox Code Playgroud)
这等效于
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
Run Code Online (Sandbox Code Playgroud)