将字典转换为列表

10

例子:

something = {
    "1": {
        "2": {
            "3": {
                "4": {},
                "5": {},
                "7": {},
                },
            "8": {
                "9": {},
                "10": {}
            },
            "11": {
                "12": {
                    "13": {
                        "14": {
                            "15": {
                                "16": {
                                    "17": {
                                        "18": {}
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
我试图将这个字典转换为如下的项目列表:
['1','2','3','4','5','6','7','8','9','10','11','12','13','14','15','16','17','18']

我该使用什么方法?

我已经尝试了something.items(),但是返回的内容是:

[('1', {'2': {'11': {'12': {'13': {'14': {'15': {'16': {'17': {'18': {}}}}}}}}, '8': {'9': {}, '10': {}}, '3': {'5': {}, '4': {}, '7': {}}}})]

这是我第一次在这里发布,如果我做错了什么,请让我知道。

谢谢你,对于这个奇怪的帖子感到抱歉。


1
所以你希望从一些嵌套字典的键中获得一个排序过的列表,并在此过程中丢弃任何重复项。就是这样吗? - 0xC0000022L
2个回答

24
你需要使用一个函数来将你的结构打平:
def flatten(d):
    for key, value in d.iteritems():
        yield key
        for sub in flatten(value):
            yield sub

如果你使用的是Python 3,应将.iteritems()替换为.items()

在Python 3.3及更高版本中,还可以使用新的yield from语法

def flatten(d):
    for key, value in d.items():
        yield key
        yield from flatten(value)

这将递归地返回所有键。要将其转换为列表,请使用:

list(flatten(elements))

由于Python字典是无序的,返回的键的顺序不会被排序。如果您希望您的键具有特定的顺序,您必须显式地对结果进行排序。


6
something = {'1': {'2': {'11': {'12': {'13': {'14': {'15': {'16': {'17': {'18': {}}}}}}}}, '3': {'4': {}, '5': {}, '7': {}}, '8': {'10': {}, '9': {}}}}}
a = []

def flatten(d,a):
    for k,v in d.items():
        a.append(k)
        flatten(v, a)
flatten(something, a)

# a == ['1', '2', '11', '12', '13', '14', '15', '16', '17', '18', '8', '9', '10', '3', '5', '4', '7']"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接