提问人:k huang 提问时间:10/22/2023 最后编辑:k huang 更新时间:10/22/2023 访问量:104
使用索引列表分配给嵌套列表
Assigning to nested list with list of indices
问:
给定一个嵌套列表,您可以使用类似
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 是否为此提供了任何结构,或者只是为此提供了标准的库函数。
答:
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`
评论