使用索引列表分配给嵌套列表

Assigning to nested list with list of indices

提问人:k huang 提问时间:10/22/2023 最后编辑:k huang 更新时间:10/22/2023 访问量:104

问:

给定一个嵌套列表,您可以使用类似

data = [[12, 15], [21, 22], [118, 546], [200, 1200]]

assert data[0][0] == 12

问题是,在这种情况下,我想索引到具有“索引列表”的嵌套列表中,在运行时长度上是动态的。例如,上面的“索引列表”将是 [0,0]

我想要这种通用类型的函数

def nested_list_assignment(nested_list, list_of_indices, value):

并且会像这样工作

# passes this basic test
data = [[12, 15], [21, 22], [118, 546], [200, 1200]]

assert data[0][0] == 12
nested_list_assignment(data, [0, 0], 0)
assert data[0][0] == 0

我有一个像这样的工作工具

def nested_list_assignment(nested_list, list_of_indices, value):
    # ill handle this case later
    assert len(list_of_indices) > 0

    if len(list_of_indices) == 1:
        nested_list[list_of_indices[0]] = value
    else:
        nested_list_assignment(nested_list[list_of_indices[0]], list_of_indices[1:], value)

但我很好奇 Python 是否为此提供了任何结构,或者只是为此提供了标准的库函数。

python list 变量赋值 嵌套列表

评论

1赞 Mark 10/22/2023
Python 中没有内置任何内容,但在 Numpy 中很常见
0赞 k huang 10/22/2023
@Mark除了标准库之外,我不能使用任何东西,但谢谢

答:

1赞 Grismar 10/22/2023 #1

没有标准的 Python 函数或运算符,但只要您确定被索引的所有内容本身都可以使用 :indices

def list_assignment(indexable, indices, value):
    for i in indices[:-1]:
        indexable = indexable[i]
    indexable[indices[-1]] = value


data = [[12, 15], [21, 22], [118, 546], [200, 1200]]
list_assignment(data, [0, 0], 0)
print(data)

输出:

[[0, 15], [21, 22], [118, 546], [200, 1200]]

这适用于您可以索引的任何内容:

d = { 
    'a': {
        'b': 1,
        'c': 2,
    },
    'd': 3
}

list_assignment(d, ['a', 'c'], 42)
print(d)

输出:

{'a': {'b': 1, 'c': 42}, 'd': 3}

请记住,这可能会在以下几个方面出错:

  • 索引的空列表失败
  • 索引过多或缺少索引的列表失败
2赞 bb1 10/22/2023 #2

基于 Grismar 的回答,为方便起见,可以使用 和 实现。方法。例如:__getitem____setitem__

class Nested:

    def __init__(self, data):
        self.data = data
    
    def __getitem__(self, t):
        x = self.data[t[0]]
        for i in t[1:]:
            x = x[i]
        return x
    
    def __setitem__(self, t, val):
        x = self.data
        for i in t[:-1]:
            x = x[i]
        x[t[-1]] = val

然后可以按如下方式使用它:

data = [[12, 15], [21, 22], [118, 546], [200, 1200]]
data = Nested(data)

print(data[2, 1])

它提供:

546

作业:

data[2, 1] = 100
print(data[2, 1])

它提供:

100
0赞 Suramuthu R 10/22/2023 #3

谢谢你指出我的错误。希望这会有所帮助。

def nested_list_assignment(nested_list, list_of_indices, value):
    L = len(list_of_indices)
    s = nested_list
    for i in range(L):
        s = s[list_of_indices[i]]
        if i == L-2:s[list_of_indices[L-2]] = value; break
    return nested_list`