当python中所有列表的所有维度都未知时,在列表列表中追加项目

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了当python中所有列表的所有维度都未知时,在列表列表中追加项目相关的知识,希望对你有一定的参考价值。

我正在尝试编写将n维数据组织到bin中的python代码。

为此,我使用以下函数初始化空列表列表,该函数采用一个数组,其中每个维度的二进制数作为参数:

def empties(b):

    invB = np.flip(b, axis=0)
    empty = []
    for b in invB:
        build = deepcopy(empty)
        empty = []
        for i in range(0,b):
            empty.append(build)

    return np.array(empty).tolist() # workaround to clear list references

例如,对于沿每个维度具有3个箱的二维数据,应该预期以下内容:

输入:

empties([3,3])

输出:

[ [[],[],[]], [[],[],[]], [[],[],[]] ]

我想将对象附加到此列表列表中。如果尺寸已知,这很容易。如果我想在位置(1,2)将一个对象附加到上面的列表中,我可以使用:

bins = empties([3,3])

obj = Object()
bins[1][2].append(obj)

但是,我希望这适用于任何未知数量的尺寸和箱数。因此,我不能使用“[] [] [] ...”表示法来定义列表索引。列表不会为索引采用列表或元组,因此这不是一个选项。另外,我不能使用numpy数组,因为所有列表可以是不同的长度。

有没有解决方法如何根据动态索引数设置列表元素?

理想情况下,如果列表可以将列表作为索引,我会这样做:

idx = some_function_that_gets_bin_numbers()

bins[idx].append(obj)
答案

我的意思是......你可以在自定义类上实现自定义__getitem__,(就像numpy一样)

但假设你不能,像:

def append_md(lst, idx, value):
    for i in idx:
        lst = lst[i]
    lst.append(value)

append_md(bins, idx, obj)

应该做的伎俩。

另一答案

您可以迭代地将索引应用于嵌套数组,如下所示:

reduce((lambda a, e: a[e]), index_list, nested_list)

如果nested_list = [0, 1, [[[2], [3]], 4], 5]index_list = [2, 0, 1],上面的线将返回[3]

以上是关于当python中所有列表的所有维度都未知时,在列表列表中追加项目的主要内容,如果未能解决你的问题,请参考以下文章

当这些行与列表中的所有值匹配时,从 Python 中的 DF 中选择行

SSAS - 类别维度 - 未知成员

当.name 属性在设计时未知时,如何为列表框控件的单击事件编程

约瑟夫问题 -- python实现

Java 可变参数列表

在python中迭代未知数量的嵌套循环