【问题标题】:Dynamic triple nested list in PythonPython中的动态三重嵌套列表
【发布时间】:2013-01-29 04:13:38
【问题描述】:

我希望在 Python 中创建一个三重嵌套列表。这意味着是 N 个个人的列表,每个人都有 L 个单词的词汇表,对于每个单词,我想存储一个结尾 (e) 和该个人最后一次使用单词 (t) 以来的时间。我知道如何做一个双重嵌套列表,本质上是给一个人一个词汇表:

individual_vocab = [[e,t] for L in range(L)]

如果我有五个词,这会给我这样的东西:

[[e,t,],[e,t],[e,t],[e,t],[e,t]]

我可以改变一个词的结尾而不改变另一个词。

现在,我想用这个词汇表初始化一组个体,如果一开始就相同就很好(事实上,更可取),但它们必须是动态的。我的第一直觉是这样的:

population =[individual_vocab for N in range(N)]

但是,当然,问题在于这不是动态的:在这种情况下,人口中的所有个体都是彼此的直接副本(即指向 individual_vocab),因此不会独立改变,这样如果我用 3 的 N 执行此操作,然后尝试为第一个个人的第一个单词的单词结尾分配一个新值,我得到这个(其中一个是 e,2s 是 t),这会改变结尾每个人的第一个词:

人口[0][0][0] = "新结局"

人口

[[['new ending', 2], [1, 2], [1, 2], [1, 2], [1, 2]], [['new ending', 2], [1, 2], [1, 2], [1, 2], [1, 2]], [['new ending', 2], [1, 2], [1, 2], [1, 2], [1, 2]]]

如何有效地制作列表列表的动态列表?

【问题讨论】:

    标签: python list dynamic nested


    【解决方案1】:

    使用copy 模块:

    import copy
    
    individual_vocab = [[e,t] for l in range(L)]
    
    population = [copy.deepcopy(individual_vocab) for n in range(N)]
    

    补充我的意见 - 我认为这种嵌套级别必须使您成为 Python 中的 Three Star C Programmer。此时我将开始使用类以保持您的代码可读性。

    【讨论】:

    • 引用网页:被称为 ThreeStarProgrammer 通常不是恭维。 ;)
    • 谢谢!这工作正常。而且我是一个乱七八糟的程序员,所以我会虚心接受那三颗星。用类重新做是个好主意,虽然我没有太多使用它们的经验(很明显) - 如果时间允许在即将到来的最后期限之前,我可能会通过尝试让它变得更干净。
    • 不是故意不尊重人。 Python 非常擅长处理列表和字典,所以我经常发现自己在这些结构上走得更远,超出了用 C++ 或 C# 编写类的程度。
    猜你喜欢
    • 2011-04-04
    • 2021-11-12
    • 1970-01-01
    • 2022-11-17
    • 1970-01-01
    • 2021-10-29
    • 2017-11-22
    • 2018-08-20
    • 1970-01-01
    相关资源
    最近更新 更多