如何遍历具有重复值的列表?

时间:2019-10-13 16:48:14

标签: python python-3.x list memory-management list-comprehension

这可能是一个非常基本的问题,但我不知道要寻找答案的必要条件:

我有此代码:

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]]

谢谢您的帮助

2 个答案:

答案 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)

您的方法存在的问题是,列表的第一个和最后一个元素引用的是同一对象。在每次迭代中打印ilist时,您会看到以下信息:

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)

这比列表理解效率要高得多,因为它没有复制元素。