【问题标题】:Reproduce a nested list / tuple structure using dictionary keys & values使用字典键和值重现嵌套列表/元组结构
【发布时间】:2020-12-09 00:29:53
【问题描述】:

我有一些嵌套列表和/或元组结构,例如:

x = [('foo',), ('bar', 'baz'), ('Ni!', 'Peng!', 'Nee-wom!')]

如果我还有一个字典,其键包含该嵌套结构的最低级别元素,例如:

d = {'foo': 99, 'bar': 50, 'baz': 100, 'Ni!': 1, 'Peng!': 2, 'Nee-wom!': 5}

是否有一种简单的方法来生成一个新对象,该对象保留原始嵌套结构,但根据dict 替换原始值?例如:

y = func(x, d)
y
# [(99,), (50, 100), (1, 2, 5)]

这里需要什么func

这基本上是基于字典的查找和替换操作,但保留了结构。我知道如何flatten a nested structure,但不确定这是正确的方法或之后如何重现它。可能是我想多了……

【问题讨论】:

    标签: python python-3.x list dictionary


    【解决方案1】:

    使用 2 级列表理解:

    y = [tuple(d[z] for z in y) for y in x]
    print(y)
    

    一个函数会更好:

    def func(x,d):
        return [tuple(d[z] for z in y) for y in x]
    
    y = func(x, d)
    print(y)
    

    【讨论】:

    • 如果您可能嵌套了一些其他集合类型(setlistbytes)并希望保留该类型,请将 tuple 更改为 type(y)。需要明确的是,对于 OP 的情况来说完全没问题,只是提到了使它更通用的方法。
    • 这适用于所示示例,但是否有通用版本?特别是,对于两种可能的情况 - 1)如果不是所有的嵌套都是元组(例如元组和列表的混合),以及 2)如果嵌套级别的数量是可变的,例如x的部分元素是否有进一步嵌套?
    • 我看到@ShadowRanger 已回答 (1),谢谢!多重嵌套的可能性呢?
    • 感谢@WasifHasan,但将其作为一个函数实际上并不能帮助进一步或可变嵌套深度的可能性吗?
    猜你喜欢
    • 2019-03-22
    • 2015-09-19
    • 2012-07-15
    • 2019-11-14
    • 2021-10-20
    • 2013-08-06
    • 1970-01-01
    • 2019-10-04
    • 2021-05-10
    相关资源
    最近更新 更多