gpt4 book ai didi

python - 迭代构建列表的最 Pythonic 方式?

转载 作者:太空狗 更新时间:2023-10-30 00:21:54 26 4
gpt4 key购买 nike

关闭。这个问题是opinion-based .它目前不接受答案。












想改善这个问题吗?更新问题,以便可以通过 editing this post 用事实和引文回答问题.

7年前关闭。




Improve this question




我试图在 Python 中使用以下一般程序做一些事情,我想知道最好的方法是什么。

首先,一个初始化步骤:

  • 创建一个项目 M。
  • 创建一个列表 L 并将 M 添加到 L。

  • 其次,循环执行以下操作:
  • 通过修改添加到 L 的最后一个项目来创建一个新项目。
  • 将新项目添加到 L。

  • 作为一个简单的例子,假设我想创建一个列表列表,其中第 n 个列表包含从 1 到 n 的数字。我可以使用以下(愚蠢的)程序。
  • 最初 M 是 [1] 并且 L=[[1]]。
  • 接下来,通过向 [1] 添加 2 以创建新项目 [1,2] 来修改 [1],然后将 [1,2] 添加到 L,因此 L=[[1],[1,2]]。
  • 接下来,通过向 [1,2] 添加 3 以创建新项 [1,2,3] 来修改 [1,2],然后将 [1,2,3] 添加到 L,因此 L=[[1],[1,2] ,[1,2,3]]。
  • 接下来,通过向 [1,2,3] 添加 4 以创建新项目 [1,2,3,4] 来修改 [1,2,3],然后将 [1,2,3,4] 添加到 L,因此 L=[[1] ,[1,2],[1,2,3],[1,2,3,4]]。

  • 我尝试了一些东西,但其中大多数不仅会修改最后添加的项目,还会修改前面步骤中添加到 L 的项目。对于我感兴趣的特定问题,我确实设法找到了一个行为正常的解决方案(至少对于小案例),但它似乎不优雅,我不确定为什么它在其他事情没有时有效,我我什至不相信它在大型案例中仍会按预期运行。我也不相信我可以调整我的方法来解决类似的问题。这不是我不理解问题的情况,因为我已经用其他编程语言编写了相同的代码而没有问题。

    所以我想知道更有经验的 Python 程序员会如何处理这个一般任务。

    (我省略了我自己的代码,部分原因是我是新来的,我还没有想出如何在 stackoverflow 上输入它,也因为它很长,我不想帮助解决特定问题,但是而是如何处理我上面描述的更一般的程序。)

    最佳答案

    添加列表对象时 M到另一个列表,您只添加了 引用 ;继续操作列表 M意味着您也将通过其他引用看到这些更改:

    >>> M = []
    >>> resultlist = []
    >>> resultlist.append(M)
    >>> M is resultlist[0]
    True
    >>> M.append(1)
    >>> resultlist[0]
    [1]
    >>> M
    [1]

    请注意 M is resultlist[0]是真的;它是同一个对象。

    您需要添加 M 的副本反而:
    resultlist.append(M[:])

    这里的整个切片( [:] 表示从头到尾切片)创建一个新列表,其中包含 M 内容的浅拷贝。 .

    构建生产系列的通用方法 L从不断变化的起点 M是使用 generator function .您只需将下一个数字添加到 M系列可以实现为:
    def growing_sequence():
    M = []
    counter = 0
    while True:
    M.append(counter)
    counter += 1
    yield M[:]

    每次迭代时,这将根据需要生成更长的列表:
    >>> gen = growing_sequence()
    >>> next(gen)
    [0]
    >>> next(gen)
    [0, 1]
    >>> for i, lst in enumerate(gen):
    ... print i, lst
    ... if i == 2: break
    ...
    0 [0, 1, 2]
    1 [0, 1, 2, 3]
    2 [0, 1, 2, 3, 4]

    关于python - 迭代构建列表的最 Pythonic 方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25587731/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com