【问题标题】:Python - Order nested list in alphabetical wayPython - 按字母顺序排列嵌套列表
【发布时间】:2011-09-12 13:14:35
【问题描述】:

我有以下列表:

["stephane", "philippe", "hélène", ["hugo", "jean-michel", "fernand"], "gustave"]

我想这样订购:

["gustave", "hélène", ["fernand", "hugo", "jean-michel"], "philippe", "stephane"]

注意:如果用户后面有嵌套列表,则该列表必须位于该用户的右侧。

除此之外,所有嵌套列表的工作方式都相同。它是递归的。

【问题讨论】:

    标签: python list nested alphabetical sorted


    【解决方案1】:

    您的数据听起来会更好地表示为字典。连续元素具有特殊关系的列表听起来很奇怪。

    如果您改为这样表示您的数据:

    {
      "stephane": {}, 
      "philippe": {}, 
      "hélène": {
        "hugo": {}, 
        "jean-michel": {},
        "fernand": {},
      }, 
      "gustave": {},
    }
    

    然后您可以简单地对字典的键进行排序以获得您想要的顺序。

    【讨论】:

    • 打败我 :) 如果 Acti67 使用的是相当新的 Python 版本,他/她可能想使用 OrderedDict
    • @Tim 我想你知道,但是对于那些不知道的人,OrderedDict 是ordered,而不是sorted。为了对其进行排序,您必须确保按排序顺序添加键值对。
    【解决方案2】:

    我使用了 Ned 的建议并想出了这个:

    d = {
        "stephane": {}, 
        "philippe": {}, 
        "helene": {
            "hugo": {}, 
            "jean-michel": {},
            "fernand": {},
        }, 
        "gustave": {},
    }
    
    def sort_dict_as_list(d):
        sorted_list = []
        for k, v in sorted(d.items()):
            if k:    
                sorted_list.append(k)
            if v:
                sorted_list.append(v)
        return sorted_list
    
    def sort_recursive(d):
        if d:
            for k, v in d.items():
                d[k] = sort_recursive(v)
            return sort_dict_as_list(d)
        else:
            return d
    
    if __name__ == "__main__":
        print sort_recursive(d)
    

    输出

    python sortit.py
    ['gustave', 'helene', ['fernand', 'hugo', 'jean-michel'], 'philippe', 'stephane']
    

    我还没有彻底测试过,但这是一个起点。我试图用列表作为数据结构来解决它,但我最终嵌套了递归函数,它太丑陋了...... Ned 的建议非常好。

    【讨论】:

    • 我猜 OP 已经有一些使用这些列表的递归代码。我会一直将它们保留为 dicts 并按 sorted() 顺序使用它们。顺便说一句,如果目的只是为了调试,pprint 模块会递归地对字典进行排序。
    最近更新 更多