这可能是一个非常基本的问题,但我不知道要寻找答案的必要条件:
我有此代码:
list = [[0,1],[0,2],[1,3],[1,4],[1,5]]
list.append(list[0])
for i in list:
i.append(0)
print(list)
此列表稍后将用作曲线的坐标。我需要在末尾复制第一个坐标才能获得闭合曲线。
如果我接下来想向列表中的每个坐标添加第三个值,则列表中的第一项和最后一项将被迭代两次:
[[0, 1, 0, 0], [0, 2, 0], [1, 3, 0], [1, 4, 0], [1, 5, 0], [0, 1, 0, 0]]
我猜测它们具有相同的内存地址,因此将附加函数一次应用于第一个索引,并将一次应用于最后一个索引,并将其应用于同一对象。
这种现象叫什么?像这样获得列表的最简单方法是什么:
[[0, 1, 0], [0, 2, 0], [1, 3, 0], [1, 4, 0], [1, 5, 0], [0, 1, 0]]
谢谢您的帮助
答案 0 :(得分:2)
您可以进行列表理解:
list = [[0,1],[0,2],[1,3],[1,4],[1,5]]
list.append(list[0])
list = [x + [0] for x in list]
print(list)
# [[0, 1, 0], [0, 2, 0], [1, 3, 0], [1, 4, 0], [1, 5, 0], [0, 1, 0]]
编辑:此处的技巧是在列表理解范围内使用x + [0]
。这样就可以创建新列表,因此您不必两次将0
附加到同一列表(将Hattip附加到@dx_over_dt)
您的方法存在的问题是,列表的第一个和最后一个元素引用的是同一对象。在每次迭代中打印i
和list
时,您会看到以下信息:
for i in list:
i.append(0)
print(i)
print(list)
因此,对于循环中的第一个i
和最后一个0
,将list.append(list[0].copy())
附加到相同的列表中。
您可以坚持添加第一个元素的副本的方法:
import a.b.c.d.soapapim.SoapApimMiddlewareService;
@Service
@EnableDefaultExceptionHandling
public class MyService{
private final SoapApimMiddlewareService myService;
public MyService(SoapApimMiddlewareService myService){
this.myService = myService;
}
public Response pullEvents(numEvents){
myService.pullEvents(numEvents);
}
}
答案 1 :(得分:2)
最简单的答案是在附加结束点之前添加0。
list = [[0,1],[0,2],[1,3],[1,4],[1,5]]
for i in list:
i.append(0)
list.append(list[0])
print(list)
这比列表理解效率要高得多,因为它没有复制元素。