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

时间:2018-11-08 04:01:48

标签: python list indexing

我正在尝试编写将n维数据组织到容器中的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个bin的二维数据,应该期望以下内容:

输入:

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)

2 个答案:

答案 0 :(得分:1)

我的意思是...您可以在自定义类上实现自定义c(0, 0, 0),(如numpy一样)

但是假设您做不到,

__getitem__

应该可以解决问题。

答案 1 :(得分:1)

您可以像这样反复将索引应用于嵌套数组:

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

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