如何在python中对嵌套字典进行排序?

时间:2021-08-31 07:40:30

I have a nested dictionary in my project:

我的项目中有一个嵌套字典:

>>> dict = {
    "content": """<p>It is common for content in Arabic, Hebrew, and other languages that use right-to-left scripts to include numerals or include text from  other scripts. Both of these typically flow  left-to-right within the overall right-to-left  context. </p>""", 
    "name": "directory", 
    "decendent": [
         {
            "content": """<p>This article tells you how to write HTML where text with different writing directions is mixed <em>within a paragraph or other HTML block</em> (ie. <dfn id="term_inline">inline or phrasal</dfn> content). (A companion article <a href="/International/questions/qa-html-dir"><cite>Structural markup and right-to-left text in HTML</cite></a> tells you how to use HTML markup for  elements such as <code class="kw">html</code>, and structural markup such as <code class="kw">p</code> or <code class="kw">div</code> and forms.)</p>""", 
            "name": "subdirectory", 
            "decendent": None
        }, 
        {
            "content": """It tells you how to use HTML markup for  elements such as <code class="kw">html</code>, and structural markup such as <code class="kw">p</code> or <code class="kw">div</code> and forms.)""", 
            "name": "subdirectory_two", 
            "decendent": [
                {
                    "content": "Name 4", 
                    "name": "subsubdirectory", 
                    "decendent": None
                }
            ]
        }
    ]
}

and a function which generates it:

以及生成它的函数:

def getname(dirpath):
    onlyfile = [entry for entry in os.listdir(dirpath) if os.path.isfile(os.path.join(dirpath, entry)) and entry.endswith(".txt")][0]
    onlyfilename = os.path.join(dirpath, onlyfile)

    decendent = []
    for entry in os.listdir(dirpath):
        entrypath = os.path.join(dirpath, entry)
        if os.path.isfile(entrypath):
            continue
        decendent.append(getname(entrypath))

    if len(decendent) == 0:
        decendent = None

    return {'name': onlyfilename.split("/")[-2],
            'path': onlyfilename.rsplit("/", 1)[-2] + "/index.html",
            'leaf': readFile(onlyfilename),
            'decendent': decendent}

The problem is that it returns an unordered set of dictionaries as descendents:

问题是它返回一组无序的词典作为后代:

如何在python中对嵌套字典进行排序?

How to sort them in my case when they're nested?

当它们嵌套时如何在我的情况下对它们进行排序?

1 个解决方案

#1


Your descendent value is just a list. Lists can be sorted, no matter where they are referenced. That it is inside a dictionary doesn't matter here.

你的后代价值只是一个清单。无论引用的位置如何,都可以对列表进行排序。它在字典里面并不重要。

Your descendent list order is set by whatever order os.listdir() returns. You can sort that, or you can simply sort the descendent object itself. Sort by using a natural sort for example, or use any other criteria for your sorting.

您的后代列表顺序由os.listdir()返回的任何顺序设置。您可以对其进行排序,或者您可以简单地对后代对象本身进行排序。例如,使用自然排序进行排序,或使用任何其他条件进行排序。

Using the natural_sort() function from Mark Byer's answer on the os.listdir() result, for example:

使用Mark Byer对os.listdir()结果的回答中的natural_sort()函数,例如:

for entry in natural_sort(os.listdir(dirpath)):

would list your directory entries in a sorted order for you to insert into the descendant list.

将按排序顺序列出您的目录条目,以便您插入到后代列表中。

#1


Your descendent value is just a list. Lists can be sorted, no matter where they are referenced. That it is inside a dictionary doesn't matter here.

你的后代价值只是一个清单。无论引用的位置如何,都可以对列表进行排序。它在字典里面并不重要。

Your descendent list order is set by whatever order os.listdir() returns. You can sort that, or you can simply sort the descendent object itself. Sort by using a natural sort for example, or use any other criteria for your sorting.

您的后代列表顺序由os.listdir()返回的任何顺序设置。您可以对其进行排序,或者您可以简单地对后代对象本身进行排序。例如,使用自然排序进行排序,或使用任何其他条件进行排序。

Using the natural_sort() function from Mark Byer's answer on the os.listdir() result, for example:

使用Mark Byer对os.listdir()结果的回答中的natural_sort()函数,例如:

for entry in natural_sort(os.listdir(dirpath)):

would list your directory entries in a sorted order for you to insert into the descendant list.

将按排序顺序列出您的目录条目,以便您插入到后代列表中。