【问题标题】:Convert a nested dictionary into list of tuples将嵌套字典转换为元组列表
【发布时间】:2019-12-28 20:30:40
【问题描述】:

我有一个dictionary -

d={'revenues':
             {
              '201907':
                      {'aaa.csv':'fdwe34x2'},
              '201906':{'ddd.csv':'e4c5q'}
             },    
   'complaints':
             {'2014':
                    {'sfdwa.csv','c2c2jh'}
             }
  }

我想把它转换成listtuples -

[
 ('revenues','201907','aaa.csv','fdwe34x2'),
 ('revenues','201906','ddd.csv','e4c5q'),
 ('complaints','2014','sfdwa.csv','c2c2jh')
]

我尝试使用list comprehensions,但没有帮助 -

l = [(k,[(p,q) for p,q in v.items()]) for k,v in d.items()]
print(l)
    [('revenues', [('201907', {'aaa.csv': 'fdwe34x2'}), ('201906', {'ddd.csv': 'e4c5q'})]),
     ('complaints', [('2014', {'c2c2jh', 'sfdwa.csv'})])]

有什么建议吗?

【问题讨论】:

  • 这个{'sfdwa.csv','c2c2jh'} 是故意存储为集合还是只是一个错字?
  • 为什么提供的代码没有按计划工作?
  • 不,没有错字。我只是尝试缩进它以便于阅读。
  • @cph_sto..我希望你做得很好。请您看看下面的问题并分享您的建议。如果可能的话,也可以将该 scala 代码转换为 pyspark。 stackoverflow.com/questions/57918129/…
  • @vikrantrana 嗨,维克兰特。我很好,我希望你一切顺利。星期一我会在我的工作站上,然后深入研究一下。

标签: python tuples dictionary-comprehension


【解决方案1】:

您可以使用列表推导式来做到这一点,但它会非常复杂,并且如果结构发生变化则不容易维护。 除非您特别需要良好的性能,否则我建议您使用通用递归函数:

def unnest(d, keys=[]):
    result = []
    if isinstance(d, dict):
        for k, v in d.items():
            result.extend(unnest(v, keys + [k]))
    elif isinstance(d, list):
        result.append(tuple(keys + d))
    elif isinstance(d, set) or isinstance(d, tuple):
        result.append(tuple(keys + list(d)))
    else:
        result.append(tuple(keys + [d]))
    return result

作为奖励,除了提供的示例中的集合之外,我还支持递归期间的列表和元组。

【讨论】:

    【解决方案2】:

    如果你不确定这个列表可能有多少层,看来你需要的是递归:

    def unnest(d, keys=[]):
        result = []
        for k, v in d.items():
            if isinstance(v, dict):
                result.extend(unnest(v, keys + [k]))
            else:
                result.append(tuple(keys + [k, v]))
        return result
    

    友情提示:在 Python 3.6 之前,不维护 dict 顺序。

    [('complaints', '2014', 'sfdwa.csv', 'c2c2jh'),
     ('revenues', '201906', 'ddd.csv', 'e4c5q'),
     ('revenues', '201907', 'aaa.csv', 'fdwe34x2')]
    

    【讨论】:

    • 非常感谢。这种结构保持不变,因此层数保持不变。
    【解决方案3】:

    您可以遍历字典的各个级别:

    [(x, y, z) for x in d for y in d[x] for z in d[x][y]]
    

    【讨论】:

    • 感谢您的回答。缺少第四个值。
    • 第四个值是多少?我以为你打错字了,意思是'complaints': {'2014': {'sfdwa.csv': 'c2c2jh'}}
    猜你喜欢
    • 2017-12-27
    • 1970-01-01
    • 2017-01-20
    • 2013-12-07
    • 1970-01-01
    • 2012-09-06
    • 2020-09-03
    • 1970-01-01
    相关资源
    最近更新 更多