【问题标题】:Read indices stored in a list读取存储在列表中的索引
【发布时间】:2019-03-05 17:15:39
【问题描述】:

我有一个存储为列表的数据集。我希望能够检索不同的数据并更改它们。我需要的片段索引存储在不同的列表中。

例如:

data_list = [[[1,2],[3,4]],[5,6]]
indices = [[0,0,1],[1,0]]

在这种情况下,我可能想检索data_list[0][0][1]data_list[1][0] 并将它们更改为值6,但我不能简单地执行data_list[indices[0]] = 6。有没有好的方法来做到这一点?

【问题讨论】:

    标签: python-3.x indexing variable-length


    【解决方案1】:

    您可以尝试遍历所有键/子键,直到获得所需的数据。

    您可以做的是将变量设置为对data_list 的引用,然后遍历索引并移动引用,直到它指向最低的嵌套列表。

    然后您可以将最低列表中的值设置为您需要的任何值。

    data_list = [[[1,2],[3,4]],[5,6]]
    indices = [[0,0,1],[1,0]]
    
    for *path, final in indices:
        val = data_list
    
        for i in path:
            val = val[i]
    
        val[final] = 6
    
    print(data_list)
    

    【讨论】:

    • 极小的调整可以说使代码看起来更好一点:让外部 for 循环将其余索引与最终索引分开。 for *rest, last in indices:val = data_listfor i in rest: val = val[i]val[last] = 6。没什么大不了的,但我不喜欢像 val[index[-1]] 这样的嵌套查找。
    • @ShadowRanger 我其实还在学习Python,感谢for *rest, last in indices的建议。我知道你可以在 for 循环中解压值,但没有意识到你可以在那里使用 *rest :-)
    • 是的,它是在 Python 3 中添加的,带有 PEP 3132: Extended Iterable Unpacking。然后由PEP 448: Additional Unpacking Generalizations 进一步扩展,为我们提供了这样的宝石,例如将两个dicts 合并为一个新的dict 作为表达式({**d1, **d2})和空的set“文字”,也就是独眼猴子运算符 ({*()})。 :-) 主要问题是这两个功能都没有详细记录或易于搜索(搜索* 非常困难)。
    • @ShadowRanger one-eyed monkey,我喜欢它!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-11
    • 2021-10-12
    • 2021-11-15
    • 2012-08-06
    • 1970-01-01
    • 2015-10-29
    相关资源
    最近更新 更多